60 lines
2.0 KiB
Forth
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)
|
|
}
|