module Degenz.DbService open Degenz.Types open System //open MongoDB.Bson //open MongoDB.Driver open Npgsql.FSharp type User = { Name : string DiscordId : uint64 Bank : int Strength : int Inventory : int array } 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 Events = [||] Traits = { PlayerTraits.empty with Strength = user.Strength } // Achievements = // tryWithDefault bson "Achievements" [||] (fun v -> // v.AsBsonArray |> Seq.map (fun (bv : BsonValue) -> bv.AsString) |> Seq.toArray) // XP = tryWithDefault bson "XP" 0 (fun v -> v.AsInt32) Bank = user.Bank } let tryFindPlayer connStr (id : 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 match List.tryHead user with | None -> return None | Some u -> return Some (mapBack u) } //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.parameters [ "did", Sql.string (string player.DiscordId) "bank", 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.parameters [ ( "did" , Sql.string (string did) ) ; ( "achievement", Sql.string achievement ) ] |> Sql.executeNonQueryAsync |> Async.AwaitTask