Add Whitelist embed to grant role. Make recruit invite code separate embed
This commit is contained in:
		
							parent
							
								
									037348cdad
								
							
						
					
					
						commit
						d161453d29
					
				@ -62,6 +62,7 @@ hackerBattleBot.add_ComponentInteractionCreated(AsyncEventHandler(HackerBattle.h
 | 
				
			|||||||
storeBot.add_ComponentInteractionCreated(AsyncEventHandler(Store.handleStoreEvents))
 | 
					storeBot.add_ComponentInteractionCreated(AsyncEventHandler(Store.handleStoreEvents))
 | 
				
			||||||
stealBot.add_ComponentInteractionCreated(AsyncEventHandler(Thief.handleStealButton))
 | 
					stealBot.add_ComponentInteractionCreated(AsyncEventHandler(Thief.handleStealButton))
 | 
				
			||||||
inviterBot.add_GuildMemberAdded(AsyncEventHandler(InviteTracker.handleGuildMemberAdded))
 | 
					inviterBot.add_GuildMemberAdded(AsyncEventHandler(InviteTracker.handleGuildMemberAdded))
 | 
				
			||||||
 | 
					inviterBot.add_ComponentInteractionCreated(AsyncEventHandler(InviteTracker.handleWhitelist))
 | 
				
			||||||
//inviterBot.add_GuildMemberRemoved(AsyncEventHandler(InviteTracker.handleGuildMemberRemoved))
 | 
					//inviterBot.add_GuildMemberRemoved(AsyncEventHandler(InviteTracker.handleGuildMemberRemoved))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let asdf (_ : DiscordClient) (event : DSharpPlus.EventArgs.InteractionCreateEventArgs) =
 | 
					let asdf (_ : DiscordClient) (event : DSharpPlus.EventArgs.InteractionCreateEventArgs) =
 | 
				
			||||||
@ -83,6 +84,8 @@ let asdf (_ : DiscordClient) (event : DSharpPlus.EventArgs.InteractionCreateEven
 | 
				
			|||||||
//if guild <> 922419263275425832uL then
 | 
					//if guild <> 922419263275425832uL then
 | 
				
			||||||
//    Trainer.sendInitialEmbed hackerBattleBot
 | 
					//    Trainer.sendInitialEmbed hackerBattleBot
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					InviteTracker.sendInitialEmbed inviterBot
 | 
				
			||||||
 | 
					
 | 
				
			||||||
hackerBattleBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously
 | 
					hackerBattleBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously
 | 
				
			||||||
GuildEnvironment.botUserHackerBattle <- Some hackerBattleBot.CurrentUser
 | 
					GuildEnvironment.botUserHackerBattle <- Some hackerBattleBot.CurrentUser
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -23,11 +23,12 @@ let tokenInviter = getVar "TOKEN_INVITER"
 | 
				
			|||||||
let channelEventsHackerBattle = getId "CHANNEL_EVENTS_HACKER_BATTLE"
 | 
					let channelEventsHackerBattle = getId "CHANNEL_EVENTS_HACKER_BATTLE"
 | 
				
			||||||
let channelTraining = getId "CHANNEL_TRAINING"
 | 
					let channelTraining = getId "CHANNEL_TRAINING"
 | 
				
			||||||
let channelArmory = getId "CHANNEL_ARMORY"
 | 
					let channelArmory = getId "CHANNEL_ARMORY"
 | 
				
			||||||
//let channelBackAlley = getId "CHANNEL_BACKALLEY"
 | 
					 | 
				
			||||||
let channelBattle = getId "CHANNEL_BATTLE"
 | 
					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 channelMarket = getId "CHANNEL_MARKET"
 | 
				
			||||||
//let channelAccessoryShop = getId "CHANNEL_ACCESSORIES"
 | 
					//let channelAccessoryShop = getId "CHANNEL_ACCESSORIES"
 | 
				
			||||||
let channelWelcome = getId "CHANNEL_WELCOME"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
//let channelThievery = getId "CHANNEL_THIEVERY"
 | 
					//let channelThievery = getId "CHANNEL_THIEVERY"
 | 
				
			||||||
let botIdHackerBattle = getId "BOT_HACKER_BATTLE"
 | 
					let botIdHackerBattle = getId "BOT_HACKER_BATTLE"
 | 
				
			||||||
@ -35,6 +36,7 @@ let botIdArmory = getId "BOT_ARMORY"
 | 
				
			|||||||
//let botInviter = getId "BOT_INVITER"
 | 
					//let botInviter = getId "BOT_INVITER"
 | 
				
			||||||
let roleTrainee = getId "ROLE_TRAINEE"
 | 
					let roleTrainee = getId "ROLE_TRAINEE"
 | 
				
			||||||
let rolePrisoner = getId "ROLE_PRISONER"
 | 
					let rolePrisoner = getId "ROLE_PRISONER"
 | 
				
			||||||
 | 
					let roleWhitelist = getId "ROLE_WHITELIST"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let mutable botUserHackerBattle : DiscordUser option = None
 | 
					let mutable botUserHackerBattle : DiscordUser option = None
 | 
				
			||||||
let mutable botUserArmory : DiscordUser option = None
 | 
					let mutable botUserArmory : DiscordUser option = None
 | 
				
			||||||
 | 
				
			|||||||
@ -11,6 +11,7 @@ open Npgsql.FSharp
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
let connStr = GuildEnvironment.connectionString
 | 
					let connStr = GuildEnvironment.connectionString
 | 
				
			||||||
let InviteRewardAmount = 100<GBT>
 | 
					let InviteRewardAmount = 100<GBT>
 | 
				
			||||||
 | 
					let WhitelistInviteRequirement = 5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Invite = {
 | 
					type Invite = {
 | 
				
			||||||
    Code : string
 | 
					    Code : string
 | 
				
			||||||
@ -22,6 +23,7 @@ let getInvites () = async {
 | 
				
			|||||||
    let! invites =
 | 
					    let! invites =
 | 
				
			||||||
        connStr
 | 
					        connStr
 | 
				
			||||||
        |> Sql.connect
 | 
					        |> Sql.connect
 | 
				
			||||||
 | 
					        // TODO: Invites shouldn't expire anymore
 | 
				
			||||||
        |> Sql.query """
 | 
					        |> Sql.query """
 | 
				
			||||||
                SELECT code, inviter, count FROM invite
 | 
					                SELECT code, inviter, count FROM invite
 | 
				
			||||||
                WHERE created_at > (current_timestamp at time zone 'utc') - interval '1 day'
 | 
					                WHERE created_at > (current_timestamp at time zone 'utc') - interval '1 day'
 | 
				
			||||||
@ -121,7 +123,7 @@ let getInvitedUsers userId =
 | 
				
			|||||||
let createGuildInvite (ctx : IDiscordContext) =
 | 
					let createGuildInvite (ctx : IDiscordContext) =
 | 
				
			||||||
    task {
 | 
					    task {
 | 
				
			||||||
        let channel = ctx.GetGuild().Channels.[GuildEnvironment.channelWelcome]
 | 
					        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
 | 
					        // 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
 | 
					        // so catch the exception thrown because the code column is unique
 | 
				
			||||||
@ -132,20 +134,21 @@ let createGuildInvite (ctx : IDiscordContext) =
 | 
				
			|||||||
            printfn "%A" ex.Message
 | 
					            printfn "%A" ex.Message
 | 
				
			||||||
            ()
 | 
					            ()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let embed =
 | 
					        let header =
 | 
				
			||||||
            DiscordEmbedBuilder()
 | 
					            DiscordEmbedBuilder()
 | 
				
			||||||
                .WithDescription($"**⏀ | Your Mission:**\nCopy this link & share it with Degenz you want to `/recruit`.\n\n" +
 | 
					                .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`." +
 | 
					                                 $"**⌼ | Your Reward:**\n`Earn {InviteRewardAmount} $GBT` 💰  for every Degen you've `/recruited`.")
 | 
				
			||||||
                                 $"```https://discord.gg/{invite.Code}```")
 | 
					 | 
				
			||||||
                .WithImageUrl("https://pbs.twimg.com/profile_banners/1449270642340089856/1640071520/1500x500")
 | 
					                .WithImageUrl("https://pbs.twimg.com/profile_banners/1449270642340089856/1640071520/1500x500")
 | 
				
			||||||
//                .WithImageUrl("https://s7.gifyu.com/images/Resistance_Poster_Final_1.jpg")
 | 
					//                .WithImageUrl("https://s7.gifyu.com/images/Resistance_Poster_Final_1.jpg")
 | 
				
			||||||
                .WithTitle("Recruitment")
 | 
					                .WithTitle("Recruitment")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let footer =
 | 
				
			||||||
 | 
					            DiscordEmbedBuilder()
 | 
				
			||||||
 | 
					                .WithDescription($"```https://discord.gg/{invite.Code}```")
 | 
				
			||||||
        let msg =
 | 
					        let msg =
 | 
				
			||||||
            DiscordInteractionResponseBuilder()
 | 
					            DiscordInteractionResponseBuilder()
 | 
				
			||||||
                .AddEmbed(embed)
 | 
					                .AddEmbeds([ header.Build() ; footer.Build() ])
 | 
				
			||||||
                .AsEphemeral(true)
 | 
					                .AsEphemeral(true)
 | 
				
			||||||
//                .WithContent($"https://discord.gg/{invite.Code}")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        do! ctx.Respond(InteractionResponseType.ChannelMessageWithSource, msg)
 | 
					        do! ctx.Respond(InteractionResponseType.ChannelMessageWithSource, msg)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -238,6 +241,58 @@ let handleGuildMemberAdded _ (eventArgs : GuildMemberAddEventArgs) =
 | 
				
			|||||||
//        do! removeInvitedUser eventArgs.Member.Id
 | 
					//        do! removeInvitedUser eventArgs.Member.Id
 | 
				
			||||||
//    } :> Task
 | 
					//    } :> 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() =
 | 
					type Inviter() =
 | 
				
			||||||
    inherit ApplicationCommandModule ()
 | 
					    inherit ApplicationCommandModule ()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user