From 014862d642725e7fab2c8890b2efeb6e1439f309 Mon Sep 17 00:00:00 2001 From: Joseph Ferano Date: Tue, 22 Feb 2022 21:11:03 +0700 Subject: [PATCH] Got SQL queries working --- Bot/Game.fs | 6 +--- DbService/DbService.fs | 79 ++++++++++++++++++------------------------ 2 files changed, 34 insertions(+), 51 deletions(-) diff --git a/Bot/Game.fs b/Bot/Game.fs index 7137c32..8ca530b 100644 --- a/Bot/Game.fs +++ b/Bot/Game.fs @@ -3,8 +3,6 @@ namespace Degenz open System.Threading.Tasks open DSharpPlus open DSharpPlus.Entities -open DSharpPlus.EventArgs -open DSharpPlus.SlashCommands open Degenz.DbService open Degenz.Messaging @@ -28,9 +26,7 @@ module Game = let executePlayerAction (ctx : IDiscordContext) (dispatch : PlayerData -> Async) = async { - let builder = DiscordInteractionResponseBuilder() - builder.IsEphemeral <- true - builder.Content <- "Content" + let builder = DiscordInteractionResponseBuilder().AsEphemeral(true) do! ctx.Respond(InteractionResponseType.DeferredChannelMessageWithSource, builder) |> Async.AwaitTask let! playerResult = tryFindPlayer GuildEnvironment.pgDb (ctx.GetDiscordMember().Id) match playerResult with diff --git a/DbService/DbService.fs b/DbService/DbService.fs index e1dbc2e..efe1cb9 100644 --- a/DbService/DbService.fs +++ b/DbService/DbService.fs @@ -18,15 +18,7 @@ type User = { let mapBack user : PlayerData = { DiscordId = user.DiscordId Name = user.Name - Inventory = - user.Inventory - |> Array.map (fun iId -> - Armory.battleItems - |> Array.tryFind (fun i -> i.Id = iId) - |> function - | Some i -> [| i |] - | None -> [||]) - |> Array.concat + Inventory = user.Inventory |> Array.choose (fun id -> Armory.battleItems |> Array.tryFind (fun i -> i.Id = id)) Events = [||] Traits = { PlayerTraits.empty with Strength = user.Strength } // Achievements = @@ -36,61 +28,56 @@ let mapBack user : PlayerData = Bank = user.Bank } -let tryFindPlayer connStr (id : uint64) = +let tryFindPlayer connStr (discordId : uint64) = async { - let! user = - connStr - |> Sql.connect - |> Sql.query "SELECT * FROM users WHERE discord_id = @did" - |> Sql.parameters [ "did", Sql.string (string id) ] - |> Sql.executeAsync (fun read -> - { - DiscordId = read.string "discord_id" |> uint64 - Name = read.string "display_name" - Bank = read.int "gbt" * 1 - Strength = read.int "strength" - Inventory = read.intArray "inventory" - }) - |> Async.AwaitTask + try + let! user = + connStr + |> Sql.connect + |> 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 -> + { + DiscordId = read.string "discord_id" |> uint64 + Name = read.string "display_name" + Bank = read.int "gbt" * 1 + Strength = read.int "strength" + Inventory = read.intArray "inventory" + }) + |> Async.AwaitTask - match List.tryHead user with - | None -> return None - | Some u -> return Some (mapBack u) + match List.tryHead user with + | None -> return None + | Some u -> return Some (mapBack u) + with e -> + printfn $"{e.Message}" + return None } -//let insertNewPlayer (player : PlayerData) = -// async { -// do! BsonDocument("Player", player.ToBsonDocument()) |> players.InsertOneAsync |> Async.AwaitTask -// } - let updatePlayer connStr (player : PlayerData) = connStr |> Sql.connect - |> Sql.query ("UPDATE users " + - "SET bank = @bank, strength = @str, inventory = @inv " + - "WHERE discordId = @did") + |> Sql.query + ("UPDATE \"user\" SET gbt = @gbt, strength = @str, inventory = @inv " + + " WHERE discord_id = @did") |> Sql.parameters [ "did", Sql.string (string player.DiscordId) - "bank", Sql.int (int player.Bank) + "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.executeNonQueryAsync |> Async.AwaitTask -//let addAchievement (id : uint64) (achievement : string) = -// async { -// let filter = Builders.Filter.Eq("Player.DiscordId", id) -// let update = Builders.Update.Push("Player.Achievements", achievement) -// return! players.UpdateOneAsync(filter, update) |> Async.AwaitTask |> Async.Ignore -// } - let addAchievement connStr (did : uint64) (achievement : string) = connStr |> Sql.connect - |> Sql.query ("WITH ach_id AS (INSERT INTO achievement (symbol) VALUES (@symbol)), " + - " usr_id AS (SELECT id FROM user WHERE discord_id = @did" + - "INSERT INTO user_achievements_achievement (user_id, achievement_id) VALUES (usr_id, ach_id) ") + |> 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