diff --git a/Bot/Bot.fs b/Bot/Bot.fs index 2936cbf..17f5609 100644 --- a/Bot/Bot.fs +++ b/Bot/Bot.fs @@ -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_GuildMemberRemoved(AsyncEventHandler(InviteTracker.handleGuildMemberRemoved)) +//inviterBot.add_GuildMemberRemoved(AsyncEventHandler(InviteTracker.handleGuildMemberRemoved)) let asdf (_ : DiscordClient) (event : DSharpPlus.EventArgs.InteractionCreateEventArgs) = async { @@ -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/DbService.fs b/Bot/DbService.fs index d9da723..acaed00 100644 --- a/Bot/DbService.fs +++ b/Bot/DbService.fs @@ -112,6 +112,18 @@ let tryFindPlayer (discordId : uint64) = async { return None } +let updatePlayerCurrency addAmount (player : PlayerData) = + connStr + |> Sql.connect + |> Sql.parameters [ + "did", Sql.string (string player.DiscordId) + "gbt", Sql.int (int addAmount) + ] |> Sql.query """ + UPDATE "user" SET gbt = gbt + @gbt WHERE discord_id = @did; + """ + |> Sql.executeNonQueryAsync + |> Async.AwaitTask + let updatePlayer (player : PlayerData) = connStr |> Sql.connect diff --git a/Bot/InviteTracker.fs b/Bot/InviteTracker.fs index 0ec2e79..0a3b4de 100644 --- a/Bot/InviteTracker.fs +++ b/Bot/InviteTracker.fs @@ -1,6 +1,5 @@ module Degenz.InviteTracker - open System.Text open System.Threading.Tasks open DSharpPlus @@ -11,6 +10,7 @@ open Degenz.Messaging open Npgsql.FSharp let connStr = GuildEnvironment.connectionString +let InviteRewardAmount = 10 type Invite = { Code : string @@ -175,16 +175,29 @@ let handleGuildMemberAdded _ (eventArgs : GuildMemberAddEventArgs) = for invite in guildInvites do let result = cachedInvites.TryFind(invite.Code) match result with - | Some (_,count) -> + | Some (inviter,count) -> if invite.Uses > count then do! addInvitedUser eventArgs.Member.Id invite.Code invite.Uses |> Async.Ignore + 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 + let channel = eventArgs.Guild.GetChannel(GuildEnvironment.channelEventsHackerBattle) + do! channel.SendMessageAsync(builder) + |> Async.AwaitTask + |> Async.Ignore + | None -> return () | None -> () } :> Task -let handleGuildMemberRemoved _ (eventArgs : GuildMemberRemoveEventArgs) = - task { - do! removeInvitedUser eventArgs.Member.Id - } :> 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) = +// task { +// do! removeInvitedUser eventArgs.Member.Id +// } :> Task type Inviter() = inherit ApplicationCommandModule ()