fix modals

This commit is contained in:
rootdarkarchon
2022-10-20 14:19:56 +02:00
parent 7ef5848eb3
commit feb3cf328f

View File

@@ -17,6 +17,15 @@ using MareSynchronosServices.Identity;
namespace MareSynchronosServices.Discord; namespace MareSynchronosServices.Discord;
internal class LodestoneModal : IModal
{
public string Title => "Verify with Lodestone";
[InputLabel("Enter the Lodestone URL of your Character")]
[ModalTextInput("lodestone_url", TextInputStyle.Short, "https://*.finalfantasyxiv.com/lodestone/character/<CHARACTERID>/")]
public string LodestoneUrl { get; set; }
}
internal class MareModule : InteractionModuleBase internal class MareModule : InteractionModuleBase
{ {
private readonly IServiceProvider _services; private readonly IServiceProvider _services;
@@ -40,11 +49,7 @@ internal class MareModule : InteractionModuleBase
await DeletePreviousUserAccount(Context.User.Id).ConfigureAwait(false); await DeletePreviousUserAccount(Context.User.Id).ConfigureAwait(false);
} }
var modal = new ModalBuilder(); await RespondWithModalAsync<LodestoneModal>("register_modal").ConfigureAwait(false);
modal.WithTitle("Verify with Lodestone");
modal.WithCustomId("register_modal");
modal.AddTextInput("Enter the Lodestone URL of your Character", "lodestoneurl", TextInputStyle.Short, "https://*.finalfantasyxiv.com/lodestone/character/<CHARACTERID>/", required: true);
await RespondWithModalAsync(modal.Build()).ConfigureAwait(false);
} }
[SlashCommand("setvanityuid", "Sets your Vanity UID.")] [SlashCommand("setvanityuid", "Sets your Vanity UID.")]
@@ -95,11 +100,7 @@ internal class MareModule : InteractionModuleBase
[SlashCommand("recover", "Allows you to recover your account by generating a new secret key")] [SlashCommand("recover", "Allows you to recover your account by generating a new secret key")]
public async Task Recover() public async Task Recover()
{ {
var modal = new ModalBuilder(); await RespondWithModalAsync<LodestoneModal>("recover_modal").ConfigureAwait(false);
modal.WithTitle("Verify with Lodestone");
modal.WithCustomId("recover_modal");
modal.AddTextInput("Enter the Lodestone URL of your Character", "lodestoneurl", TextInputStyle.Short, "https://*.finalfantasyxiv.com/lodestone/character/<CHARACTERID>/", required: true);
await RespondWithModalAsync(modal.Build()).ConfigureAwait(false);
} }
[SlashCommand("userinfo", "Shows you your user information")] [SlashCommand("userinfo", "Shows you your user information")]
@@ -115,16 +116,16 @@ internal class MareModule : InteractionModuleBase
} }
[ModalInteraction("recover_modal")] [ModalInteraction("recover_modal")]
public async Task RecoverModal() public async Task RecoverModal(LodestoneModal modal)
{ {
var embed = await HandleRecoverModalAsync((SocketModal)Context.Interaction).ConfigureAwait(false); var embed = await HandleRecoverModalAsync(modal, Context.User.Id).ConfigureAwait(false);
await RespondAsync(embeds: new Embed[] { embed }, ephemeral: true).ConfigureAwait(false); await RespondAsync(embeds: new Embed[] { embed }, ephemeral: true).ConfigureAwait(false);
} }
[ModalInteraction("register_modal")] [ModalInteraction("register_modal")]
public async Task RegisterModal() public async Task RegisterModal(LodestoneModal modal)
{ {
var embed = await HandleRegisterModalAsync((SocketModal)Context.Interaction).ConfigureAwait(false); var embed = await HandleRegisterModalAsync(modal, Context.User.Id).ConfigureAwait(false);
await RespondAsync(embeds: new Embed[] { embed }, ephemeral: true).ConfigureAwait(false); await RespondAsync(embeds: new Embed[] { embed }, ephemeral: true).ConfigureAwait(false);
} }
@@ -204,11 +205,11 @@ internal class MareModule : InteractionModuleBase
return eb; return eb;
} }
private async Task<Embed> HandleRecoverModalAsync(SocketModal arg) private async Task<Embed> HandleRecoverModalAsync(LodestoneModal arg, ulong userid)
{ {
var embed = new EmbedBuilder(); var embed = new EmbedBuilder();
var lodestoneId = ParseCharacterIdFromLodestoneUrl(arg.Data.Components.Single(c => c.CustomId == "lodestoneurl").Value); var lodestoneId = ParseCharacterIdFromLodestoneUrl(arg.LodestoneUrl);
if (lodestoneId == null) if (lodestoneId == null)
{ {
embed.WithTitle("Invalid Lodestone URL"); embed.WithTitle("Invalid Lodestone URL");
@@ -224,7 +225,7 @@ internal class MareModule : InteractionModuleBase
await using var db = scope.ServiceProvider.GetService<MareDbContext>(); await using var db = scope.ServiceProvider.GetService<MareDbContext>();
var existingLodestoneAuth = await db.LodeStoneAuth.Include("User") var existingLodestoneAuth = await db.LodeStoneAuth.Include("User")
.FirstOrDefaultAsync(a => a.DiscordId == arg.User.Id && a.HashedLodestoneId == hashedLodestoneId) .FirstOrDefaultAsync(a => a.DiscordId == userid && a.HashedLodestoneId == hashedLodestoneId)
.ConfigureAwait(false); .ConfigureAwait(false);
// check if discord id or lodestone id is banned // check if discord id or lodestone id is banned
@@ -267,11 +268,11 @@ internal class MareModule : InteractionModuleBase
return embed.Build(); return embed.Build();
} }
private async Task<Embed> HandleRegisterModalAsync(SocketModal arg) private async Task<Embed> HandleRegisterModalAsync(LodestoneModal arg, ulong userid)
{ {
var embed = new EmbedBuilder(); var embed = new EmbedBuilder();
var lodestoneId = ParseCharacterIdFromLodestoneUrl(arg.Data.Components.Single(c => c.CustomId == "lodestoneurl").Value); var lodestoneId = ParseCharacterIdFromLodestoneUrl(arg.LodestoneUrl);
if (lodestoneId == null) if (lodestoneId == null)
{ {
embed.WithTitle("Invalid Lodestone URL"); embed.WithTitle("Invalid Lodestone URL");
@@ -289,12 +290,12 @@ internal class MareModule : InteractionModuleBase
using var db = scope.ServiceProvider.GetService<MareDbContext>(); using var db = scope.ServiceProvider.GetService<MareDbContext>();
// check if discord id or lodestone id is banned // check if discord id or lodestone id is banned
if (db.BannedRegistrations.Any(a => a.DiscordIdOrLodestoneAuth == arg.User.Id.ToString() || a.DiscordIdOrLodestoneAuth == hashedLodestoneId)) if (db.BannedRegistrations.Any(a => a.DiscordIdOrLodestoneAuth == userid.ToString() || a.DiscordIdOrLodestoneAuth == hashedLodestoneId))
{ {
embed.WithTitle("no"); embed.WithTitle("no");
embed.WithDescription("your account is banned"); embed.WithDescription("your account is banned");
} }
else if (db.LodeStoneAuth.Any(a => a.DiscordId == arg.User.Id)) else if (db.LodeStoneAuth.Any(a => a.DiscordId == userid))
{ {
// user already in db // user already in db
embed.WithTitle("Registration failed"); embed.WithTitle("Registration failed");
@@ -308,7 +309,7 @@ internal class MareModule : InteractionModuleBase
} }
else else
{ {
string lodestoneAuth = await GenerateLodestoneAuth(arg.User.Id, hashedLodestoneId, db).ConfigureAwait(false); string lodestoneAuth = await GenerateLodestoneAuth(userid, hashedLodestoneId, db).ConfigureAwait(false);
// check if lodestone id is already in db // check if lodestone id is already in db
embed.WithTitle("Authorize your character"); embed.WithTitle("Authorize your character");
embed.WithDescription("Add following key to your character profile at https://na.finalfantasyxiv.com/lodestone/my/setting/profile/" embed.WithDescription("Add following key to your character profile at https://na.finalfantasyxiv.com/lodestone/my/setting/profile/"
@@ -322,7 +323,7 @@ internal class MareModule : InteractionModuleBase
+ "You can delete the entry from your profile after verification." + "You can delete the entry from your profile after verification."
+ Environment.NewLine + Environment.NewLine + Environment.NewLine + Environment.NewLine
+ "The verification will expire in approximately 15 minutes. If you fail to **/verify** the registration will be invalidated and you have to **/register** again."); + "The verification will expire in approximately 15 minutes. If you fail to **/verify** the registration will be invalidated and you have to **/register** again.");
_botServices.DiscordLodestoneMapping[arg.User.Id] = lodestoneId.ToString(); _botServices.DiscordLodestoneMapping[userid] = lodestoneId.ToString();
} }
} }