From 31de79f1b6f2871d57c9116dffc3af077616b44a Mon Sep 17 00:00:00 2001 From: Joseph Ferano Date: Wed, 23 Feb 2022 18:54:23 +0700 Subject: [PATCH] PlayerEvents SQL and updates to the model --- Bot/HackerBattle.fs | 7 +--- Bot/Thief.fs | 4 +-- Bot/Trainer.fs | 2 +- DbService/DbService.fs | 82 ++++++++++++++++++++++++++++++++++++------ Shared/Shared.fs | 7 +--- 5 files changed, 77 insertions(+), 25 deletions(-) diff --git a/Bot/HackerBattle.fs b/Bot/HackerBattle.fs index effeb9c..ab53a0c 100644 --- a/Bot/HackerBattle.fs +++ b/Bot/HackerBattle.fs @@ -82,12 +82,7 @@ let updateCombatants successfulHack (attacker : PlayerData) (defender : PlayerDa HackId = hack.Id Adversary = if isDefenderEvent then attacker.basicPlayer else defender.basicPlayer IsInstigator = not isDefenderEvent - Result = - match successfulHack , isDefenderEvent with - | true , true -> PlayerEventResult.Negative - | false , true -> PlayerEventResult.Positive - | true , false -> PlayerEventResult.Positive - | false , false -> PlayerEventResult.Negative + Success = successfulHack } { Type = Hacking hackEvent Timestamp = DateTime.UtcNow diff --git a/Bot/Thief.fs b/Bot/Thief.fs index 665b3a1..e0bcb93 100644 --- a/Bot/Thief.fs +++ b/Bot/Thief.fs @@ -151,7 +151,7 @@ let handleSteal (ctx : IDiscordContext) = let num = rand.NextDouble() let dp = { DiscordPlayer.Id = targetId ; DiscordPlayer.Name = targetName } - let stealAction result = { + let stealAction = { Type = Stealing ( true , dp ) Cooldown = ThiefCooldown.Minutes * 1 Timestamp = DateTime.UtcNow @@ -185,7 +185,7 @@ let handleSteal (ctx : IDiscordContext) = |> Async.Ignore | false -> let embed = getResultEmbed' WentToPrison - do! DbService.updatePlayer GuildEnvironment.pgDb { thief with Events = Array.append [| stealAction PlayerEventResult.Neutral |] thief.Events } + do! DbService.updatePlayer GuildEnvironment.pgDb { thief with Events = Array.append [| stealAction |] thief.Events } |> Async.Ignore do! Messaging.sendFollowUpEmbed ctx (embed.Build()) do! Async.Sleep 2000 diff --git a/Bot/Trainer.fs b/Bot/Trainer.fs index 5881691..68fcc08 100644 --- a/Bot/Trainer.fs +++ b/Bot/Trainer.fs @@ -18,7 +18,7 @@ let TrainerEvents = [| Cooldown = 2 Type = Hacking { Adversary = Sensei - Result = PlayerEventResult.Positive + Success = true IsInstigator = true HackId = defaultHack.Id } } { Timestamp = System.DateTime.UtcNow diff --git a/DbService/DbService.fs b/DbService/DbService.fs index f28eb9f..9bf37ff 100644 --- a/DbService/DbService.fs +++ b/DbService/DbService.fs @@ -34,8 +34,10 @@ let tryFindPlayer connStr (discordId : uint64) = let! user = connStr |> Sql.connect - |> Sql.query ("SELECT discord_id, display_name, gbt, strength, inventory " + - "FROM \"user\" WHERE discord_id = @did") + |> Sql.query """ + SELECT discord_id, display_name, gbt, strength, inventory + FROM "user" WHERE discord_id = @did") + """ |> Sql.parameters [ "did", Sql.string (string discordId) ] |> Sql.executeAsync (fun read -> { @@ -58,26 +60,86 @@ let tryFindPlayer connStr (discordId : uint64) = let updatePlayer connStr (player : PlayerData) = connStr |> Sql.connect - |> Sql.query - ("UPDATE \"user\" SET gbt = @gbt, strength = @str, inventory = @inv " + - " WHERE discord_id = @did") |> Sql.parameters [ "did", Sql.string (string player.DiscordId) "gbt", Sql.int (int player.Bank) "str", Sql.int (int player.Traits.Strength) "inv", Sql.intArray (player.Inventory |> Array.map (fun i -> i.Id)) ] + |> Sql.query """ + UPDATE "user" SET gbt = @gbt, strength = @str, inventory = @inv + WHERE discord_id = @did") + """ |> Sql.executeNonQueryAsync |> Async.AwaitTask let addAchievement connStr (did : uint64) (achievement : string) = connStr |> Sql.connect - |> Sql.query - ("WITH ach AS (INSERT INTO achievement (symbol) VALUES (@symbol) RETURNING id), - usr AS (SELECT id FROM \"user\" WHERE discord_id = @did) - INSERT INTO user_achievements_achievement (user_id, achievement_id) SELECT usr.id, ach.id FROM usr, ach") - + |> Sql.query """ + WITH ach AS (INSERT INTO achievement (symbol) VALUES (@symbol) RETURNING id), + usr AS (SELECT id FROM "user" WHERE discord_id = @did) + INSERT INTO user_achievements_achievement (user_id, achievement_id) SELECT usr.id, ach.id FROM usr, ach") + """ |> Sql.parameters [ ( "did" , Sql.string (string did) ) ; ( "achievement", Sql.string achievement ) ] |> Sql.executeNonQueryAsync |> Async.AwaitTask + +let addPlayerEvent connStr (did : uint64) (playerEvent : PlayerEvent) = + let sqlParams , query = + match playerEvent.Type with + | Hacking h -> + [ + ( "did", Sql.string (string did) ) + ( "success" , Sql.bool h.Success ) + ( "is_instigator", Sql.bool h.IsInstigator ) + ( "item_id", Sql.int h.HackId ) + ( "cooldown", Sql.int (int playerEvent.Cooldown) ) + ( "adversary_id", Sql.string (string h.Adversary.Id) ) + ( "adversary_name", Sql.string (string h.Adversary.Name) ) + ] , + """ + WITH usr AS (SELECT id FROM "user" WHERE discord_id = @did) + INSERT INTO player_event (event_type, success, is_instigator, item_id, cooldown, adversary_id, adversary_name, user_id) + SELECT 'Hacking', @success, @is_instigator, @item_id, @cooldown, @adversary_id, @adversary_name, usr.id FROM usr + """ + | Shielding id -> + [ + ( "did" , Sql.string (string did) ) + ( "item_id", Sql.int id ) + ( "cooldown", Sql.int (int playerEvent.Cooldown) ) + ] , + """ + WITH usr AS (SELECT id FROM "user" WHERE discord_id = @did) + INSERT INTO player_event (event_type, item_id, cooldown, user_id) + SELECT 'Shielding', @item_id, @cooldown, usr.id FROM usr + """ + | Stealing(instigator, victim) -> + [ + ( "did" , Sql.string (string did) ) + ( "is_instigator", Sql.bool instigator ) + ( "adversary_id", Sql.string (string victim.Id) ) + ( "adversary_name", Sql.string (string victim.Name) ) + ( "cooldown", Sql.int (int playerEvent.Cooldown) ) + ] , + """ + WITH usr AS (SELECT id FROM "user" WHERE discord_id = @did) + INSERT INTO player_event (event_type, is_instigator, adversary_id, adversary_name, cooldown, user_id) + SELECT 'Stealing', @is_instigator, @adversary_id, @adversary_name, @cooldown, usr.id FROM usr + """ + | Imprison -> + [ + ( "did" , Sql.string (string did) ) + ( "cooldown", Sql.int (int playerEvent.Cooldown) ) + ] , + """ + WITH usr AS (SELECT id FROM "user" WHERE discord_id = @did) + INSERT INTO player_event (event_type, cooldown, user_id) + SELECT 'Stealing', @cooldown, usr.id FROM usr + """ + connStr + |> Sql.connect + |> Sql.parameters sqlParams + |> Sql.query query + |> Sql.executeNonQueryAsync + |> Async.AwaitTask diff --git a/Shared/Shared.fs b/Shared/Shared.fs index 28fb11e..366a086 100644 --- a/Shared/Shared.fs +++ b/Shared/Shared.fs @@ -87,15 +87,10 @@ module Types = type DiscordPlayer = { Id: uint64; Name: string } with static member empty = { Id = 0uL ; Name = "None" } - type PlayerEventResult = - | Positive - | Neutral - | Negative - type HackEvent = { IsInstigator : bool Adversary : DiscordPlayer - Result : PlayerEventResult + Success : bool HackId : int }