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))
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 =

View File

@ -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

View File

@ -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<GBT>
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 ()