Add Whitelist embed to grant role. Make recruit invite code separate embed

This commit is contained in:
Joseph Ferano 2022-03-22 12:40:32 +07:00
parent 037348cdad
commit d161453d29
3 changed files with 69 additions and 9 deletions

View File

@ -62,6 +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_GuildMemberRemoved(AsyncEventHandler(InviteTracker.handleGuildMemberRemoved))
let asdf (_ : DiscordClient) (event : DSharpPlus.EventArgs.InteractionCreateEventArgs) =
@ -83,6 +84,8 @@ let asdf (_ : DiscordClient) (event : DSharpPlus.EventArgs.InteractionCreateEven
//if guild <> 922419263275425832uL then
// Trainer.sendInitialEmbed hackerBattleBot
InviteTracker.sendInitialEmbed inviterBot
hackerBattleBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously
GuildEnvironment.botUserHackerBattle <- Some hackerBattleBot.CurrentUser

View File

@ -23,11 +23,12 @@ let tokenInviter = getVar "TOKEN_INVITER"
let channelEventsHackerBattle = getId "CHANNEL_EVENTS_HACKER_BATTLE"
let channelTraining = getId "CHANNEL_TRAINING"
let channelArmory = getId "CHANNEL_ARMORY"
//let channelBackAlley = getId "CHANNEL_BACKALLEY"
let channelBattle = getId "CHANNEL_BATTLE"
let channelWelcome = getId "CHANNEL_WELCOME"
let channelWhitelist = getId "CHANNEL_WHITELIST"
//let channelBackAlley = getId "CHANNEL_BACKALLEY"
//let channelMarket = getId "CHANNEL_MARKET"
//let channelAccessoryShop = getId "CHANNEL_ACCESSORIES"
let channelWelcome = getId "CHANNEL_WELCOME"
//let channelThievery = getId "CHANNEL_THIEVERY"
let botIdHackerBattle = getId "BOT_HACKER_BATTLE"
@ -35,6 +36,7 @@ let botIdArmory = getId "BOT_ARMORY"
//let botInviter = getId "BOT_INVITER"
let roleTrainee = getId "ROLE_TRAINEE"
let rolePrisoner = getId "ROLE_PRISONER"
let roleWhitelist = getId "ROLE_WHITELIST"
let mutable botUserHackerBattle : DiscordUser option = None
let mutable botUserArmory : DiscordUser option = None

View File

@ -11,6 +11,7 @@ open Npgsql.FSharp
let connStr = GuildEnvironment.connectionString
let InviteRewardAmount = 100<GBT>
let WhitelistInviteRequirement = 5
type Invite = {
Code : string
@ -22,6 +23,7 @@ let getInvites () = async {
let! invites =
connStr
|> Sql.connect
// TODO: Invites shouldn't expire anymore
|> Sql.query """
SELECT code, inviter, count FROM invite
WHERE created_at > (current_timestamp at time zone 'utc') - interval '1 day'
@ -121,7 +123,7 @@ let getInvitedUsers userId =
let createGuildInvite (ctx : IDiscordContext) =
task {
let channel = ctx.GetGuild().Channels.[GuildEnvironment.channelWelcome]
let! invite = channel.CreateInviteAsync(max_age = 86400, unique = true)
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
@ -132,20 +134,21 @@ let createGuildInvite (ctx : IDiscordContext) =
printfn "%A" ex.Message
()
let embed =
let header =
DiscordEmbedBuilder()
.WithDescription($"**⏀ | Your Mission:**\nCopy this link & share it with Degenz you want to `/recruit`.\n\n" +
$"**⌼ | Your Reward:**\n`Earn {InviteRewardAmount} $GBT` 💰 for every Degen you've `/recruited`." +
$"```https://discord.gg/{invite.Code}```")
.WithDescription($"**⏀ | 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`.")
.WithImageUrl("https://pbs.twimg.com/profile_banners/1449270642340089856/1640071520/1500x500")
// .WithImageUrl("https://s7.gifyu.com/images/Resistance_Poster_Final_1.jpg")
.WithTitle("Recruitment")
let footer =
DiscordEmbedBuilder()
.WithDescription($"```https://discord.gg/{invite.Code}```")
let msg =
DiscordInteractionResponseBuilder()
.AddEmbed(embed)
.AddEmbeds([ header.Build() ; footer.Build() ])
.AsEphemeral(true)
// .WithContent($"https://discord.gg/{invite.Code}")
do! ctx.Respond(InteractionResponseType.ChannelMessageWithSource, msg)
}
@ -238,6 +241,58 @@ let handleGuildMemberAdded _ (eventArgs : GuildMemberAddEventArgs) =
// do! removeInvitedUser eventArgs.Member.Id
// } :> Task
let sendInitialEmbed (client : DiscordClient) =
async {
try
let! channel = client.GetChannelAsync(GuildEnvironment.channelWhitelist) |> Async.AwaitTask
let builder = DiscordMessageBuilder()
let embed = DiscordEmbedBuilder()
embed.ImageUrl <- "https://securitygladiators.com/wp-content/uploads/2020/09/Whitelist-Website-Featured-Image.jpg"
builder.AddEmbed embed |> ignore
builder.Content <- "Click on the button to get whitelist!"
let button = DiscordButtonComponent(ButtonStyle.Success, $"Trainer-1", $"Gimme") :> DiscordComponent
builder.AddComponents [| button |] |> ignore
do! channel.SendMessageAsync(builder)
|> Async.AwaitTask
|> Async.Ignore
with e ->
printfn $"Error trying to get channel {GuildEnvironment.channelTraining}\n\n{e.Message}"
} |> Async.RunSynchronously
type WhitelistResult =
| NotEnoughInvites of currentAmount : int
| Granted of DiscordRole
| AlreadyWhitelisted
let tryGrantWhitelist (ctx : IDiscordContext) =
async {
let user = ctx.GetDiscordMember()
let role = ctx.GetGuild().GetRole(GuildEnvironment.roleWhitelist)
if Seq.contains role user.Roles
then return AlreadyWhitelisted
else
let! total = getInviteAttributions user.Id
if total >= WhitelistInviteRequirement then
return Granted role
else
return NotEnoughInvites total
}
let handleWhitelist (_ : DiscordClient) (event : ComponentInteractionCreateEventArgs) =
task {
let ctx = DiscordEventContext event :> IDiscordContext
let builder = DiscordInteractionResponseBuilder().AsEphemeral(true)
match! tryGrantWhitelist ctx with
| AlreadyWhitelisted ->
builder.Content <- "You are already whitelisted"
| NotEnoughInvites total ->
builder.Content <- $"You need to invite more people into the server. Please invite {WhitelistInviteRequirement - total} more people to get Whitelist"
| Granted role ->
do! ctx.GetDiscordMember().GrantRoleAsync(role)
builder.Content <- "You have been granted whitelist"
do! ctx.Respond(InteractionResponseType.ChannelMessageWithSource, builder)
} :> Task
type Inviter() =
inherit ApplicationCommandModule ()