97 lines
3.3 KiB
Forth

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<GBT>
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<GBT>
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<BsonDocument>.Filter.Eq("Player.DiscordId", id)
// let update = Builders<BsonDocument>.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