61 lines
1.9 KiB
Forth

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<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 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)
.Limit(Nullable<int>(number))
.SortBy(fun e -> e.Player.Bank)
.ToListAsync()
|> Async.AwaitTask
return entries |> Seq.map (fun e -> e.Player)
}