Improvements to the invite mechanic
This commit is contained in:
		
							parent
							
								
									ea9500bdaa
								
							
						
					
					
						commit
						0f78219635
					
				@ -91,7 +91,7 @@ GuildEnvironment.botUserArmory <- Some storeBot.CurrentUser
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
//stealBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously
 | 
					//stealBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//inviterBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously
 | 
					inviterBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let rec loop areBotsRunning =
 | 
					let rec loop areBotsRunning =
 | 
				
			||||||
 | 
				
			|||||||
@ -7,7 +7,6 @@ open Degenz
 | 
				
			|||||||
open Newtonsoft.Json
 | 
					open Newtonsoft.Json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module Armory =
 | 
					module Armory =
 | 
				
			||||||
//    let weapons : ItemDetails list= []
 | 
					 | 
				
			||||||
    let weapons : ItemDetails list =
 | 
					    let weapons : ItemDetails list =
 | 
				
			||||||
        let file = System.IO.File.ReadAllText("Items.json")
 | 
					        let file = System.IO.File.ReadAllText("Items.json")
 | 
				
			||||||
//        let file = System.IO.File.ReadAllText("Bot/Items.json")
 | 
					//        let file = System.IO.File.ReadAllText("Bot/Items.json")
 | 
				
			||||||
 | 
				
			|||||||
@ -61,6 +61,14 @@ let addInvitedUser did code count =
 | 
				
			|||||||
        |> Async.Ignore
 | 
					        |> Async.Ignore
 | 
				
			||||||
    with _ -> async.Zero ()
 | 
					    with _ -> async.Zero ()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let acceptInvite did =
 | 
				
			||||||
 | 
					    connStr
 | 
				
			||||||
 | 
					    |> Sql.connect
 | 
				
			||||||
 | 
					    |> Sql.parameters [ "did" , Sql.string (string did) ]
 | 
				
			||||||
 | 
					    |> Sql.query "UPDATE invited_user SET accepted = true WHERE discord_id = @did"
 | 
				
			||||||
 | 
					    |> Sql.executeNonQueryAsync
 | 
				
			||||||
 | 
					    |> Async.AwaitTask
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let removeInvitedUser did =
 | 
					let removeInvitedUser did =
 | 
				
			||||||
    try
 | 
					    try
 | 
				
			||||||
        connStr
 | 
					        connStr
 | 
				
			||||||
@ -72,6 +80,20 @@ let removeInvitedUser did =
 | 
				
			|||||||
        |> Async.Ignore
 | 
					        |> Async.Ignore
 | 
				
			||||||
    with _ -> async.Zero ()
 | 
					    with _ -> async.Zero ()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let checkUserInvited userId = async {
 | 
				
			||||||
 | 
					    let! result =
 | 
				
			||||||
 | 
					        connStr
 | 
				
			||||||
 | 
					        |> Sql.connect
 | 
				
			||||||
 | 
					        |> Sql.parameters [ "did" , Sql.string (string userId) ]
 | 
				
			||||||
 | 
					        |> Sql.query """
 | 
				
			||||||
 | 
					                SELECT id FROM invited_user WHERE discord_id = @did
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        |> Sql.executeAsync (fun read -> read.int "id")
 | 
				
			||||||
 | 
					        |> Async.AwaitTask
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return List.isEmpty result |> not
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let getInviteAttributions userId =
 | 
					let getInviteAttributions userId =
 | 
				
			||||||
    connStr
 | 
					    connStr
 | 
				
			||||||
    |> Sql.connect
 | 
					    |> Sql.connect
 | 
				
			||||||
@ -91,7 +113,7 @@ let getInvitedUsers userId =
 | 
				
			|||||||
    |> Sql.query """
 | 
					    |> Sql.query """
 | 
				
			||||||
            WITH invite AS (SELECT id FROM invite WHERE inviter = @did)
 | 
					            WITH invite AS (SELECT id FROM invite WHERE inviter = @did)
 | 
				
			||||||
            SELECT discord_id FROM invited_user, invite
 | 
					            SELECT discord_id FROM invited_user, invite
 | 
				
			||||||
            WHERE invite.id = invited_user.invite_id AND invited_user.accepted = true;
 | 
					            WHERE invite.id = invited_user.invite_id;
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
    |> Sql.executeAsync (fun read -> read.string "discord_id" |> uint64)
 | 
					    |> Sql.executeAsync (fun read -> read.string "discord_id" |> uint64)
 | 
				
			||||||
    |> Async.AwaitTask
 | 
					    |> Async.AwaitTask
 | 
				
			||||||
@ -113,7 +135,7 @@ let createGuildInvite (ctx : IDiscordContext) =
 | 
				
			|||||||
        let embed =
 | 
					        let embed =
 | 
				
			||||||
            DiscordEmbedBuilder()
 | 
					            DiscordEmbedBuilder()
 | 
				
			||||||
                .WithDescription($"Copy this link and share it with any Degenz you want to recruit to the Degenz Army.\n\n" +
 | 
					                .WithDescription($"Copy this link and share it with any Degenz you want to recruit to the Degenz Army.\n\n" +
 | 
				
			||||||
                                 "**YOUR REWARD:** Recruit `10` people and gain access to Beautopia©" +
 | 
					                                 "**YOUR REWARD:** Eartn 10 💰$GBT for every person you recruit that comes into the server" +
 | 
				
			||||||
                                 $"```https://discord.gg/{invite.Code}```")
 | 
					                                 $"```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")
 | 
				
			||||||
                .WithTitle("Your mission")
 | 
					                .WithTitle("Your mission")
 | 
				
			||||||
@ -151,12 +173,14 @@ let getAttributions (ctx : IDiscordContext) userId = task {
 | 
				
			|||||||
let getInvitedUsersForId (ctx : IDiscordContext) = task {
 | 
					let getInvitedUsersForId (ctx : IDiscordContext) = task {
 | 
				
			||||||
    let! users = getInvitedUsers(ctx.GetDiscordMember().Id)
 | 
					    let! users = getInvitedUsers(ctx.GetDiscordMember().Id)
 | 
				
			||||||
    let sb = StringBuilder()
 | 
					    let sb = StringBuilder()
 | 
				
			||||||
 | 
					    let mutable count = 0
 | 
				
			||||||
    for user in users do
 | 
					    for user in users do
 | 
				
			||||||
        sb.AppendLine($"<@{user}>") |> ignore
 | 
					        count <- count + 1
 | 
				
			||||||
 | 
					        sb.AppendLine($"{count}.) <@{user}>") |> ignore
 | 
				
			||||||
    let msg =
 | 
					    let msg =
 | 
				
			||||||
        DiscordInteractionResponseBuilder()
 | 
					        DiscordInteractionResponseBuilder()
 | 
				
			||||||
            .AsEphemeral(true)
 | 
					            .AsEphemeral(true)
 | 
				
			||||||
            .WithContent($"<@{ctx.GetDiscordMember().Id}> has invited the following people:\n{sb}")
 | 
					            .WithContent($"**Total Earned:** `{users.Length * InviteRewardAmount} 💰$GBT `\n\n**Last 10 users recruited:**\n{sb}")
 | 
				
			||||||
    do! ctx.Respond(InteractionResponseType.ChannelMessageWithSource, msg)
 | 
					    do! ctx.Respond(InteractionResponseType.ChannelMessageWithSource, msg)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -169,7 +193,7 @@ let clearInvites (ctx : IDiscordContext) = task {
 | 
				
			|||||||
        |> Async.Ignore
 | 
					        |> Async.Ignore
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let handleGuildMemberAdded _ (eventArgs : GuildMemberAddEventArgs) =
 | 
					let processNewUser (eventArgs : GuildMemberAddEventArgs) =
 | 
				
			||||||
    task {
 | 
					    task {
 | 
				
			||||||
         let! guildInvites = eventArgs.Guild.GetInvitesAsync()
 | 
					         let! guildInvites = eventArgs.Guild.GetInvitesAsync()
 | 
				
			||||||
         let! cachedInvites = getInvites()
 | 
					         let! cachedInvites = getInvites()
 | 
				
			||||||
@ -179,12 +203,13 @@ let handleGuildMemberAdded _ (eventArgs : GuildMemberAddEventArgs) =
 | 
				
			|||||||
             | Some (inviter,count) ->
 | 
					             | Some (inviter,count) ->
 | 
				
			||||||
                 if invite.Uses > count then
 | 
					                 if invite.Uses > count then
 | 
				
			||||||
                     do! addInvitedUser eventArgs.Member.Id invite.Code invite.Uses |> Async.Ignore
 | 
					                     do! addInvitedUser eventArgs.Member.Id invite.Code invite.Uses |> Async.Ignore
 | 
				
			||||||
 | 
					                     let! _ = acceptInvite eventArgs.Member.Id
 | 
				
			||||||
                     let! player = DbService.tryFindPlayer inviter
 | 
					                     let! player = DbService.tryFindPlayer inviter
 | 
				
			||||||
                     match player with
 | 
					                     match player with
 | 
				
			||||||
                     | Some player ->
 | 
					                     | Some player ->
 | 
				
			||||||
                         do! DbService.updatePlayerCurrency (int InviteRewardAmount) player |> Async.Ignore
 | 
					                         do! DbService.updatePlayerCurrency (int InviteRewardAmount) player |> Async.Ignore
 | 
				
			||||||
                         let builder = DiscordMessageBuilder()
 | 
					                         let builder = DiscordMessageBuilder()
 | 
				
			||||||
                         builder.WithContent($"{eventArgs.Member.DisplayName} was invited to the server. <@{player.DiscordId}> just earned {InviteRewardAmount} 💰$GBT!") |> ignore
 | 
					                         builder.WithContent($"{eventArgs.Member.DisplayName} was recruited to the server. <@{player.DiscordId}> just earned {InviteRewardAmount} 💰$GBT for their efforts!") |> ignore
 | 
				
			||||||
                         let channel = eventArgs.Guild.GetChannel(GuildEnvironment.channelEventsHackerBattle)
 | 
					                         let channel = eventArgs.Guild.GetChannel(GuildEnvironment.channelEventsHackerBattle)
 | 
				
			||||||
                         do! channel.SendMessageAsync(builder)
 | 
					                         do! channel.SendMessageAsync(builder)
 | 
				
			||||||
                             |> Async.AwaitTask
 | 
					                             |> Async.AwaitTask
 | 
				
			||||||
@ -193,6 +218,13 @@ let handleGuildMemberAdded _ (eventArgs : GuildMemberAddEventArgs) =
 | 
				
			|||||||
             | None -> ()
 | 
					             | None -> ()
 | 
				
			||||||
    } :> Task
 | 
					    } :> 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
 | 
					// 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.
 | 
					// rewarding GBT.
 | 
				
			||||||
//let handleGuildMemberRemoved _ (eventArgs : GuildMemberRemoveEventArgs) =
 | 
					//let handleGuildMemberRemoved _ (eventArgs : GuildMemberRemoveEventArgs) =
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user