diff --git a/Bot/Bot.fs b/Bot/Bot.fs index 99c9495..17f5609 100644 --- a/Bot/Bot.fs +++ b/Bot/Bot.fs @@ -91,7 +91,7 @@ GuildEnvironment.botUserArmory <- Some storeBot.CurrentUser //stealBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously -//inviterBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously +inviterBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously let rec loop areBotsRunning = diff --git a/Bot/GameHelpers.fs b/Bot/GameHelpers.fs index 0999674..ca6e930 100644 --- a/Bot/GameHelpers.fs +++ b/Bot/GameHelpers.fs @@ -7,7 +7,6 @@ open Degenz open Newtonsoft.Json module Armory = -// let weapons : ItemDetails list= [] let weapons : ItemDetails list = let file = System.IO.File.ReadAllText("Items.json") // let file = System.IO.File.ReadAllText("Bot/Items.json") diff --git a/Bot/InviteTracker.fs b/Bot/InviteTracker.fs index cd7aa97..943fe9f 100644 --- a/Bot/InviteTracker.fs +++ b/Bot/InviteTracker.fs @@ -61,6 +61,14 @@ let addInvitedUser did code count = |> Async.Ignore 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 = try connStr @@ -72,6 +80,20 @@ let removeInvitedUser did = |> Async.Ignore 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 = connStr |> Sql.connect @@ -91,7 +113,7 @@ let getInvitedUsers userId = |> Sql.query """ WITH invite AS (SELECT id FROM invite WHERE inviter = @did) 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) |> Async.AwaitTask @@ -113,7 +135,7 @@ let createGuildInvite (ctx : IDiscordContext) = let embed = DiscordEmbedBuilder() .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}```") .WithImageUrl("https://pbs.twimg.com/profile_banners/1449270642340089856/1640071520/1500x500") .WithTitle("Your mission") @@ -151,12 +173,14 @@ let getAttributions (ctx : IDiscordContext) userId = task { let getInvitedUsersForId (ctx : IDiscordContext) = task { let! users = getInvitedUsers(ctx.GetDiscordMember().Id) let sb = StringBuilder() + let mutable count = 0 for user in users do - sb.AppendLine($"<@{user}>") |> ignore + count <- count + 1 + sb.AppendLine($"{count}.) <@{user}>") |> ignore let msg = DiscordInteractionResponseBuilder() .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) } @@ -169,7 +193,7 @@ let clearInvites (ctx : IDiscordContext) = task { |> Async.Ignore } -let handleGuildMemberAdded _ (eventArgs : GuildMemberAddEventArgs) = +let processNewUser (eventArgs : GuildMemberAddEventArgs) = task { let! guildInvites = eventArgs.Guild.GetInvitesAsync() let! cachedInvites = getInvites() @@ -179,12 +203,13 @@ let handleGuildMemberAdded _ (eventArgs : GuildMemberAddEventArgs) = | Some (inviter,count) -> if invite.Uses > count then do! addInvitedUser eventArgs.Member.Id invite.Code invite.Uses |> Async.Ignore + let! _ = acceptInvite eventArgs.Member.Id let! player = DbService.tryFindPlayer inviter match player with | Some player -> do! DbService.updatePlayerCurrency (int InviteRewardAmount) player |> Async.Ignore 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) do! channel.SendMessageAsync(builder) |> Async.AwaitTask @@ -193,6 +218,13 @@ let handleGuildMemberAdded _ (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) =