module Degenz.DbService open System open Degenz.Shared open MongoDB.Bson open MongoDB.Driver type PlayerEntry = { Id : BsonObjectId Player : Player } //let connString = "mongodb://localhost:27017" let connString = "mongodb+srv://joe:mtmu3XXe3crUfXdO@stage.2hyxh.mongodb.net/degenz?retryWrites=true&w=majority" let mongo = MongoClient(connString) let db = mongo.GetDatabase("degenz") let players = db.GetCollection("players") let tryFindPlayer (id : uint64) : Async = async { let filter = Builders.Filter.Eq((fun e -> e.Player.DiscordId), id) let! player = players.FindAsync(filter) |> Async.AwaitTask return match player.ToEnumerable() |> Seq.toList with | [] -> None | entry::_ -> Some entry.Player } let insertNewPlayer (player : Player) = async { do! { Id = BsonObjectId(ObjectId.GenerateNewId()) ; Player = player } |> players.InsertOneAsync |> Async.AwaitTask } let removePlayer (memberId : uint64) = async { // TODO: Check the result of this delete operation return! players.DeleteOneAsync (fun e -> e.Player.DiscordId = memberId) |> Async.AwaitTask |> Async.Ignore } let updatePlayer player = async { let filter = Builders.Filter.Eq((fun e -> e.Player.DiscordId), player.DiscordId) let update = Builders.Update.Set((fun e -> e.Player), player) return! players.UpdateOneAsync(filter, update) |> Async.AwaitTask |> Async.Ignore } let getTopPlayers number = async { let! entries = players.Find(fun _ -> true).SortBy(fun e -> e.Player.Bank).Limit(Nullable(number)).ToListAsync() |> Async.AwaitTask return entries |> Seq.map (fun e -> e.Player) }