Reward currency to the right player when inviting

This commit is contained in:
Joseph Ferano 2022-03-15 12:13:51 +07:00
parent df6983516c
commit 8ef038e806
3 changed files with 33 additions and 8 deletions

View File

@ -62,7 +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_GuildMemberRemoved(AsyncEventHandler(InviteTracker.handleGuildMemberRemoved)) //inviterBot.add_GuildMemberRemoved(AsyncEventHandler(InviteTracker.handleGuildMemberRemoved))
let asdf (_ : DiscordClient) (event : DSharpPlus.EventArgs.InteractionCreateEventArgs) = let asdf (_ : DiscordClient) (event : DSharpPlus.EventArgs.InteractionCreateEventArgs) =
async { async {
@ -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 =

View File

@ -112,6 +112,18 @@ let tryFindPlayer (discordId : uint64) = async {
return None 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) = let updatePlayer (player : PlayerData) =
connStr connStr
|> Sql.connect |> Sql.connect

View File

@ -1,6 +1,5 @@
module Degenz.InviteTracker module Degenz.InviteTracker
open System.Text open System.Text
open System.Threading.Tasks open System.Threading.Tasks
open DSharpPlus open DSharpPlus
@ -11,6 +10,7 @@ open Degenz.Messaging
open Npgsql.FSharp open Npgsql.FSharp
let connStr = GuildEnvironment.connectionString let connStr = GuildEnvironment.connectionString
let InviteRewardAmount = 10<GBT>
type Invite = { type Invite = {
Code : string Code : string
@ -175,16 +175,29 @@ let handleGuildMemberAdded _ (eventArgs : GuildMemberAddEventArgs) =
for invite in guildInvites do for invite in guildInvites do
let result = cachedInvites.TryFind(invite.Code) let result = cachedInvites.TryFind(invite.Code)
match result with match result with
| Some (_,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! 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 -> () | None -> ()
} :> Task } :> Task
let handleGuildMemberRemoved _ (eventArgs : GuildMemberRemoveEventArgs) = // 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
task { // rewarding GBT.
do! removeInvitedUser eventArgs.Member.Id //let handleGuildMemberRemoved _ (eventArgs : GuildMemberRemoveEventArgs) =
} :> Task // task {
// do! removeInvitedUser eventArgs.Member.Id
// } :> Task
type Inviter() = type Inviter() =
inherit ApplicationCommandModule () inherit ApplicationCommandModule ()