Fixing DbService so it just reads and writes the player
This commit is contained in:
parent
3f42296818
commit
d329714aef
1
.gitignore
vendored
1
.gitignore
vendored
@ -455,3 +455,4 @@ $RECYCLE.BIN/
|
||||
!.vscode/launch.json
|
||||
!.vscode/extensions.json
|
||||
*.org
|
||||
/.paket/load/
|
||||
|
@ -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() =
|
||||
[<SlashCommand("status", "Get your current status like bank account, and active hacks and defenses")>]
|
||||
member this.Status (ctx : InteractionContext) = Commands.status ctx
|
||||
|
||||
[<SlashCommand("leaderboard", "View the current list of players ranked by highest earnings")>]
|
||||
member this.Leaderboard (ctx : InteractionContext) = Commands.leaderboard ctx
|
||||
// [<SlashCommand("leaderboard", "View the current list of players ranked by highest earnings")>]
|
||||
// member this.Leaderboard (ctx : InteractionContext) = Commands.leaderboard ctx
|
||||
|
||||
|
||||
|
@ -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<PlayerEntry>("players")
|
||||
let players = db.GetCollection<BsonDocument>("players")
|
||||
|
||||
let tryFindPlayer (id : uint64) : Async<Player option> =
|
||||
let tryFindPlayer (id : uint64) =
|
||||
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 filter = Builders<BsonDocument>.Filter.Eq("Player.DiscordId", id);
|
||||
let! player = players.Find<BsonDocument>(filter).FirstOrDefaultAsync() |> Async.AwaitTask
|
||||
return match player with
|
||||
| null -> None
|
||||
| player ->
|
||||
player
|
||||
.GetValue("Player")
|
||||
.ToBsonDocument()
|
||||
|> BsonSerializer.Deserialize<Player>
|
||||
|> 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)
|
||||
let dict = [ KeyValuePair("Player" , player.ToBsonDocument() :> Object) ]
|
||||
do! BsonDocument(dict)
|
||||
|> players.InsertOneAsync
|
||||
|> 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)
|
||||
let filter = Builders<BsonDocument>.Filter.Eq("Player.DiscordId", player.DiscordId)
|
||||
let update = Builders<BsonDocument>.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<int>(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()
|
||||
// }
|
Loading…
x
Reference in New Issue
Block a user