60 lines
2.0 KiB
Forth

module DegenzGame.DbService
open System
open DegenzGame.Shared
open MongoDB.Bson
open MongoDB.Driver
type PlayerEntry = {
Id : BsonObjectId
Player : Player
}
let mongo = MongoClient("mongodb://localhost:27017")
let db = mongo.GetDatabase("degenz-game")
let players = db.GetCollection<PlayerEntry>("players")
let tryFindPlayer (id : uint64) : Async<Player option> =
async {
let filter = Builders<PlayerEntry>.Filter.Eq((fun e -> e.Player.DiscordId), id)
let! player = players.FindAsync<PlayerEntry>(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 updateAttacks (playerId : uint64) (attacks : Attack array) =
async {
let filter = Builders<PlayerEntry>.Filter.Eq((fun e -> e.Player.DiscordId), playerId)
let update = Builders<PlayerEntry>.Update.Set((fun e -> e.Player.Attacks), attacks)
return! players.UpdateOneAsync(filter, update) |> Async.AwaitTask |> Async.Ignore
}
let updatePlayer player =
async {
let filter = Builders<PlayerEntry>.Filter.Eq((fun e -> e.Player.DiscordId), player.DiscordId)
let update = Builders<PlayerEntry>.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<int>(number)).ToListAsync() |> Async.AwaitTask
return entries |> Seq.map (fun e -> e.Player)
}