From 863e5e37680b16bd1b772595127be499ef890910 Mon Sep 17 00:00:00 2001 From: Joseph Ferano Date: Tue, 22 Mar 2022 22:44:18 +0700 Subject: [PATCH] Make the link appear with a button --- Bot/Bot.fs | 2 +- Bot/InviteTracker.fs | 96 +++++++++++++++++++++++++------------------- 2 files changed, 55 insertions(+), 43 deletions(-) diff --git a/Bot/Bot.fs b/Bot/Bot.fs index f605719..87f366c 100644 --- a/Bot/Bot.fs +++ b/Bot/Bot.fs @@ -62,7 +62,7 @@ hackerBattleBot.add_ComponentInteractionCreated(AsyncEventHandler(HackerBattle.h storeBot.add_ComponentInteractionCreated(AsyncEventHandler(Store.handleStoreEvents)) stealBot.add_ComponentInteractionCreated(AsyncEventHandler(Thief.handleStealButton)) inviterBot.add_GuildMemberAdded(AsyncEventHandler(InviteTracker.handleGuildMemberAdded)) -inviterBot.add_ComponentInteractionCreated(AsyncEventHandler(InviteTracker.handleWhitelist)) +inviterBot.add_ComponentInteractionCreated(AsyncEventHandler(InviteTracker.handleButtonEvent)) //inviterBot.add_GuildMemberRemoved(AsyncEventHandler(InviteTracker.handleGuildMemberRemoved)) let asdf (_ : DiscordClient) (event : DSharpPlus.EventArgs.InteractionCreateEventArgs) = diff --git a/Bot/InviteTracker.fs b/Bot/InviteTracker.fs index de96739..c2dc4bb 100644 --- a/Bot/InviteTracker.fs +++ b/Bot/InviteTracker.fs @@ -122,54 +122,29 @@ let getInvitedUsers userId = let createGuildInvite (ctx : IDiscordContext) showWhitelistReward = task { - let builder = DiscordInteractionResponseBuilder().AsEphemeral(true) - do! ctx.Respond(InteractionResponseType.DeferredChannelMessageWithSource, builder) - - let channel = ctx.GetGuild().Channels.[GuildEnvironment.channelWelcome] - let! invite = channel.CreateInviteAsync(max_age = 0, unique = true) - - // When a player generates an invite code but it hasn't expired, it generates the same code, creating a duplicate entry - // so catch the exception thrown because the code column is unique - try - let! _ = createInvite (ctx.GetDiscordMember().Id) invite.Code - return () - with ex -> - printfn "%A" ex.Message - () - let invitesRequired = 5 let rewardMsg = if showWhitelistReward then - $"**⏀ | Your Mission:**\nRecruit {invitesRequired} Degenz into Beautopia©.\n\n" + + $"**⏀ | Your Mission:**\nUse the link to **recruit** {invitesRequired} Degenz into Beautopia©.\n\n" + $"**⌼ | Your Reward:**\nGet awarded **Whitelist**." else $"**⏀ | Your Mission:**\nCopy the link & share it with Degenz you want to `/recruit`.\n\n" + $"**⌼ | Your Reward:**\n`Earn {InviteRewardAmount} $GBT` 💰 for every Degen you've `/recruited`." - let header = + let embed = DiscordEmbedBuilder() .WithDescription(rewardMsg) .WithImageUrl("https://pbs.twimg.com/profile_banners/1449270642340089856/1640071520/1500x500") .WithTitle("Recruitment") - let msg = - DiscordFollowupMessageBuilder() - .AddEmbed(header.Build()) + let builder = + DiscordInteractionResponseBuilder() + .AddEmbed(embed) .AsEphemeral(true) - do! ctx.FollowUp(msg) + let button = DiscordButtonComponent(ButtonStyle.Success, $"CreateGuildInvite", $"Give it to me") :> DiscordComponent + builder.AddComponents [| button |] |> ignore + do! ctx.Respond(InteractionResponseType.ChannelMessageWithSource, builder) - let msg = - DiscordFollowupMessageBuilder() - .WithContent($"⬇️ COPY THE LINK BELOW ⬇") - .AsEphemeral(true) - - do! ctx.FollowUp(msg) - let msg = - DiscordFollowupMessageBuilder() - .WithContent($"https://discord.gg/{invite.Code}") - .AsEphemeral(true) - - do! ctx.FollowUp(msg) } :> Task let listServerInvites (ctx : IDiscordContext) = task { @@ -246,13 +221,6 @@ let processNewUser (eventArgs : GuildMemberAddEventArgs) = | None -> () } :> Task -let handleGuildMemberAdded _ (eventArgs : GuildMemberAddEventArgs) = - task { - let! exists = checkUserInvited eventArgs.Member.Id - if not exists then - do! processNewUser eventArgs - } :> Task - // If we do it like this then there's an obvious exploit where the user can come and go as many times and it will keep // rewarding GBT. //let handleGuildMemberRemoved _ (eventArgs : GuildMemberRemoveEventArgs) = @@ -297,9 +265,8 @@ let tryGrantWhitelist (ctx : IDiscordContext) = return NotEnoughInvites total } -let handleWhitelist (_ : DiscordClient) (event : ComponentInteractionCreateEventArgs) = +let handleWhitelist (ctx : IDiscordContext) = task { - let ctx = DiscordEventContext event :> IDiscordContext let builder = DiscordInteractionResponseBuilder().AsEphemeral(true) match! tryGrantWhitelist ctx with | AlreadyWhitelisted -> @@ -316,6 +283,51 @@ let handleWhitelist (_ : DiscordClient) (event : ComponentInteractionCreateEvent do! ctx.Respond(InteractionResponseType.ChannelMessageWithSource, builder) } :> Task +let handleCreateInvite (ctx : IDiscordContext) = + task { + let builder = DiscordInteractionResponseBuilder().AsEphemeral(true) + do! ctx.Respond(InteractionResponseType.DeferredChannelMessageWithSource, builder) + + let channel = ctx.GetGuild().Channels.[GuildEnvironment.channelWelcome] + let! invite = channel.CreateInviteAsync(max_age = 0, unique = true) + + // When a player generates an invite code but it hasn't expired, it generates the same code, creating a duplicate entry + // so catch the exception thrown because the code column is unique + try + let! _ = createInvite (ctx.GetDiscordMember().Id) invite.Code + return () + with ex -> + printfn "%A" ex.Message + () + + let msg = + DiscordFollowupMessageBuilder() + .WithContent($"https://discord.gg/{invite.Code}") + .AsEphemeral(true) + + do! ctx.FollowUp(msg) + } + +let handleButtonEvent (_ : DiscordClient) (event : ComponentInteractionCreateEventArgs) = + let eventCtx = DiscordEventContext event :> IDiscordContext + match event.Id with + | id when id.StartsWith("GimmeWhitelist") -> handleWhitelist eventCtx + | id when id.StartsWith("CreateGuildInvite") -> handleCreateInvite eventCtx + | _ -> + task { + let builder = DiscordInteractionResponseBuilder() + builder.IsEphemeral <- true + builder.Content <- $"Incorrect Action identifier {eventCtx.GetInteractionId()}" + do! eventCtx.Respond(InteractionResponseType.ChannelMessageWithSource, builder) |> Async.AwaitTask + } + +let handleGuildMemberAdded _ (eventArgs : GuildMemberAddEventArgs) = + task { + let! exists = checkUserInvited eventArgs.Member.Id + if not exists then + do! processNewUser eventArgs + } :> Task + type Inviter() = inherit ApplicationCommandModule ()