Make the link appear with a button

This commit is contained in:
Joseph Ferano 2022-03-22 22:44:18 +07:00
parent 69f68c10c4
commit 863e5e3768
2 changed files with 55 additions and 43 deletions

View File

@ -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) =

View File

@ -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 ()