From d329714aefccf1af56df7002c8a64d0a9fc7ef42 Mon Sep 17 00:00:00 2001 From: Joseph Ferano Date: Mon, 24 Jan 2022 23:27:28 +0700 Subject: [PATCH] Fixing DbService so it just reads and writes the player --- .gitignore | 1 + Bot/PlayerInteractions.fs | 44 ++++++++++++++-------------- DbService/DbService.fs | 61 ++++++++++++++++++--------------------- 3 files changed, 51 insertions(+), 55 deletions(-) diff --git a/.gitignore b/.gitignore index 9c911b4..2a74373 100644 --- a/.gitignore +++ b/.gitignore @@ -455,3 +455,4 @@ $RECYCLE.BIN/ !.vscode/launch.json !.vscode/extensions.json *.org +/.paket/load/ diff --git a/Bot/PlayerInteractions.fs b/Bot/PlayerInteractions.fs index e6be220..8c50814 100644 --- a/Bot/PlayerInteractions.fs +++ b/Bot/PlayerInteractions.fs @@ -69,7 +69,7 @@ module Commands = // do! ctx.Member.RevokeRoleAsync(role) // |> Async.AwaitTask - do! DbService.removePlayer ctx.Member.Id +// do! DbService.removePlayer ctx.Member.Id do! ctx.CreateResponseAsync("You are now lame", true) |> Async.AwaitTask @@ -83,26 +83,26 @@ module Commands = Name : string } - let leaderboard (ctx : InteractionContext) = - async { +// let leaderboard (ctx : InteractionContext) = +// async { // do! ctx.CreateResponseAsync(InteractionResponseType.DeferredChannelMessageWithSource) |> Async.AwaitTask - - let builder = DiscordInteractionResponseBuilder() - builder.IsEphemeral <- true - - let! leaders = DbService.getTopPlayers 10 - let content = - leaders - |> Seq.toArray - |> Array.sortByDescending (fun p -> p.Bank) - |> Array.mapi (fun i p -> { Position = string (i + 1) ; Amount = string p.Bank ; Name = p.Name }) - |> Formatter.Format - builder.Content <- if not <| String.IsNullOrEmpty content then $"```{content}```" else "There are no active hackers" - do! ctx.Interaction.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource, builder) - |> Async.AwaitTask - |> Async.Ignore - } |> Async.StartAsTask - :> Task +// +// let builder = DiscordFollowupMessageBuilder() +// builder.IsEphemeral <- true +// +// let! leaders = DbService.getTopPlayers 10 +// let content = +// leaders +// |> Seq.toArray +// |> Array.sortByDescending (fun p -> p.Bank) +// |> Array.mapi (fun i p -> { Position = string (i + 1) ; Amount = string p.Bank ; Name = p.Name }) +// |> Formatter.Format +// builder.Content <- if not <| String.IsNullOrEmpty content then $"```{content}```" else "There are no active hackers" +// do! ctx.Interaction.CreateFollowupMessageAsync(builder) +// |> Async.AwaitTask +// |> Async.Ignore +// } |> Async.StartAsTask +// :> Task let status (ctx : InteractionContext) = async { @@ -134,7 +134,7 @@ type PlayerInteractions() = [] member this.Status (ctx : InteractionContext) = Commands.status ctx - [] - member this.Leaderboard (ctx : InteractionContext) = Commands.leaderboard ctx +// [] +// member this.Leaderboard (ctx : InteractionContext) = Commands.leaderboard ctx diff --git a/DbService/DbService.fs b/DbService/DbService.fs index 58b4101..f03079d 100644 --- a/DbService/DbService.fs +++ b/DbService/DbService.fs @@ -1,60 +1,55 @@ module Degenz.DbService open System +open System.Collections.Generic open Degenz.Shared open MongoDB.Bson +open MongoDB.Bson.Serialization 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 mongo = MongoClient(Environment.GetEnvironmentVariable("CONN_STRING")) let db = mongo.GetDatabase("degenz") -let players = db.GetCollection("players") +let players = db.GetCollection("players") -let tryFindPlayer (id : uint64) : Async = +let tryFindPlayer (id : uint64) = 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 filter = Builders.Filter.Eq("Player.DiscordId", id); + let! player = players.Find(filter).FirstOrDefaultAsync() |> Async.AwaitTask + return match player with + | null -> None + | player -> + player + .GetValue("Player") + .ToBsonDocument() + |> BsonSerializer.Deserialize + |> Some } let insertNewPlayer (player : Player) = async { - do! { Id = BsonObjectId(ObjectId.GenerateNewId()) ; Player = player } + let dict = [ KeyValuePair("Player" , player.ToBsonDocument() :> Object) ] + do! BsonDocument(dict) |> players.InsertOneAsync |> Async.AwaitTask } -let removePlayer (memberId : uint64) = +let deletePlayer (player : Player) = async { - // TODO: Check the result of this delete operation - return! players.DeleteOneAsync (fun e -> e.Player.DiscordId = memberId) - |> Async.AwaitTask - |> Async.Ignore + let dict = [ KeyValuePair("Player" , player.ToBsonDocument() :> Object) ] + do! BsonDocument(dict) + |> players.InsertOneAsync + |> Async.AwaitTask } 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) + let filter = Builders.Filter.Eq("Player.DiscordId", player.DiscordId) + let update = Builders.Update.Set("Player", player) return! players.UpdateOneAsync(filter, update) |> Async.AwaitTask |> Async.Ignore } -let getTopPlayers number = - async { - let! entries = - players.Find(fun _ -> true) - .Limit(Nullable(number)) - .SortBy(fun e -> e.Player.Bank) - .ToListAsync() - |> Async.AwaitTask - return entries |> Seq.map (fun e -> e.Player) - } +//let getTopPlayers amount = +// async { +// return! players.FindAsync() +// } \ No newline at end of file