updatePlayer, achievements, and find player queries
This commit is contained in:
		
							parent
							
								
									24ce8bdc7f
								
							
						
					
					
						commit
						fc56b4a64b
					
				@ -82,8 +82,8 @@ let updateCombatants successfulHack (attacker : PlayerData) (defender : PlayerDa
 | 
				
			|||||||
            | false , false -> PlayerEventResult.Negative
 | 
					            | false , false -> PlayerEventResult.Negative
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    [ DbService.updatePlayer <| updatePlayer  prize (event false) attacker
 | 
					    [ DbService.updatePlayer GuildEnvironment.pgDb <| updatePlayer  prize (event false) attacker
 | 
				
			||||||
      DbService.updatePlayer <| updatePlayer -prize (event true)  defender ]
 | 
					      DbService.updatePlayer GuildEnvironment.pgDb <| updatePlayer -prize (event true)  defender ]
 | 
				
			||||||
    |> Async.Parallel
 | 
					    |> Async.Parallel
 | 
				
			||||||
    |> Async.Ignore
 | 
					    |> Async.Ignore
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -190,7 +190,8 @@ let handleDefense (ctx : IDiscordContext) =
 | 
				
			|||||||
                    IsInstigator = true
 | 
					                    IsInstigator = true
 | 
				
			||||||
                    Adversary = DiscordPlayer.empty
 | 
					                    Adversary = DiscordPlayer.empty
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                do! DbService.updatePlayer <| { p with Events = Array.append [| defense |] p.Events  }
 | 
					                do! DbService.updatePlayer GuildEnvironment.pgDb <| { p with Events = Array.append [| defense |] p.Events  }
 | 
				
			||||||
 | 
					                    |> Async.Ignore
 | 
				
			||||||
                let builder = DiscordMessageBuilder()
 | 
					                let builder = DiscordMessageBuilder()
 | 
				
			||||||
                builder.WithContent($"{ctx.GetDiscordMember().Username} has protected their system!") |> ignore
 | 
					                builder.WithContent($"{ctx.GetDiscordMember().Username} has protected their system!") |> ignore
 | 
				
			||||||
                let channel = ctx.GetGuild().GetChannel(GuildEnvironment.channelEventsHackerBattle)
 | 
					                let channel = ctx.GetGuild().GetChannel(GuildEnvironment.channelEventsHackerBattle)
 | 
				
			||||||
@ -209,7 +210,8 @@ let arsenal (ctx : IDiscordContext) =
 | 
				
			|||||||
        builder.AddEmbed(embed) |> ignore
 | 
					        builder.AddEmbed(embed) |> ignore
 | 
				
			||||||
        builder.IsEphemeral <- true
 | 
					        builder.IsEphemeral <- true
 | 
				
			||||||
        do! ctx.FollowUp(builder) |> Async.AwaitTask
 | 
					        do! ctx.FollowUp(builder) |> Async.AwaitTask
 | 
				
			||||||
        do! DbService.updatePlayer updatedPlayer
 | 
					        do! DbService.updatePlayer GuildEnvironment.pgDb updatedPlayer
 | 
				
			||||||
 | 
					            |> Async.Ignore
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let handleButtonEvent (_ : DiscordClient) (event : ComponentInteractionCreateEventArgs) =
 | 
					let handleButtonEvent (_ : DiscordClient) (event : ComponentInteractionCreateEventArgs) =
 | 
				
			||||||
 | 
				
			|||||||
@ -29,7 +29,7 @@ module Commands =
 | 
				
			|||||||
                | Some _ -> async.Return false
 | 
					                | Some _ -> async.Return false
 | 
				
			||||||
                | None ->
 | 
					                | None ->
 | 
				
			||||||
                    async {
 | 
					                    async {
 | 
				
			||||||
                        do! newPlayer "" discordId |> DbService.insertNewPlayer
 | 
					//                        do! newPlayer "" discordId |> DbService.insertNewPlayer
 | 
				
			||||||
                        return true
 | 
					                        return true
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
            return newPlayer
 | 
					            return newPlayer
 | 
				
			||||||
 | 
				
			|||||||
@ -24,9 +24,11 @@ type SlotMachine() =
 | 
				
			|||||||
                                || (results.[0] <> results.[1] && results.[1] <> results.[2] && results.[0] <> results.[2])
 | 
					                                || (results.[0] <> results.[1] && results.[1] <> results.[2] && results.[0] <> results.[2])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if winConditions then
 | 
					            if winConditions then
 | 
				
			||||||
                do! DbService.updatePlayer { player with Bank = player.Bank + 10<GBT> }
 | 
					                do! DbService.updatePlayer GuildEnvironment.pgDb { player with Bank = player.Bank + 10<GBT> }
 | 
				
			||||||
 | 
					                    |> Async.Ignore
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
                do! DbService.updatePlayer { player with Bank = max (player.Bank - 1<GBT>) 0<GBT> }
 | 
					                do! DbService.updatePlayer GuildEnvironment.pgDb { player with Bank = max (player.Bank - 1<GBT>) 0<GBT> }
 | 
				
			||||||
 | 
					                    |> Async.Ignore
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            do! ctx.Interaction.CreateResponseAsync(InteractionResponseType.DeferredChannelMessageWithSource)
 | 
					            do! ctx.Interaction.CreateResponseAsync(InteractionResponseType.DeferredChannelMessageWithSource)
 | 
				
			||||||
 | 
				
			|||||||
@ -52,7 +52,8 @@ let handleBuyItem (ctx : IDiscordContext) itemId =
 | 
				
			|||||||
            |> handleResultWithResponse ctx (fun player -> async {
 | 
					            |> handleResultWithResponse ctx (fun player -> async {
 | 
				
			||||||
                let newBalance = player.Bank - item.Price
 | 
					                let newBalance = player.Bank - item.Price
 | 
				
			||||||
                let p = { player with Bank = newBalance ; Inventory = Array.append [| item |] player.Inventory }
 | 
					                let p = { player with Bank = newBalance ; Inventory = Array.append [| item |] player.Inventory }
 | 
				
			||||||
                do! DbService.updatePlayer p
 | 
					                do! DbService.updatePlayer GuildEnvironment.pgDb p
 | 
				
			||||||
 | 
					                    |> Async.Ignore
 | 
				
			||||||
                do! sendFollowUpMessage ctx $"Successfully purchased {item.Name}! You now have {newBalance} 💰$GBT remaining"
 | 
					                do! sendFollowUpMessage ctx $"Successfully purchased {item.Name}! You now have {newBalance} 💰$GBT remaining"
 | 
				
			||||||
            })
 | 
					            })
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
@ -72,7 +73,8 @@ let handleSell (ctx : IDiscordContext) itemId =
 | 
				
			|||||||
                                then player.Events |> Array.filter (fun a -> a.ItemId <> itemId)
 | 
					                                then player.Events |> Array.filter (fun a -> a.ItemId <> itemId)
 | 
				
			||||||
                                else player.Events
 | 
					                                else player.Events
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                do! DbService.updatePlayer updatedPlayer
 | 
					                do! DbService.updatePlayer GuildEnvironment.pgDb updatedPlayer
 | 
				
			||||||
 | 
					                    |> Async.Ignore
 | 
				
			||||||
                do! sendFollowUpMessage ctx $"Sold {item.Type} {item.Name} for {item.Price}! Current Balance: {updatedPlayer.Bank}"
 | 
					                do! sendFollowUpMessage ctx $"Sold {item.Type} {item.Name} for {item.Price}! Current Balance: {updatedPlayer.Bank}"
 | 
				
			||||||
            })
 | 
					            })
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
				
			|||||||
@ -176,7 +176,8 @@ let handleSteal (ctx : IDiscordContext) =
 | 
				
			|||||||
                    Cooldown = VictimRecovery.Minutes * 1<mins>
 | 
					                    Cooldown = VictimRecovery.Minutes * 1<mins>
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                let actions = t |> Player.removeExpiredActions |> fun p -> Array.append [| mugged |] p.Events
 | 
					                let actions = t |> Player.removeExpiredActions |> fun p -> Array.append [| mugged |] p.Events
 | 
				
			||||||
                do! DbService.updatePlayer { t with Bank = max (t.Bank - prize) 0<GBT> ; Events = actions }
 | 
					                do! DbService.updatePlayer GuildEnvironment.pgDb { t with Bank = max (t.Bank - prize) 0<GBT> ; Events = actions }
 | 
				
			||||||
 | 
					                    |> Async.Ignore
 | 
				
			||||||
            | None -> ()
 | 
					            | None -> ()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            let stole = {
 | 
					            let stole = {
 | 
				
			||||||
@ -189,10 +190,12 @@ let handleSteal (ctx : IDiscordContext) =
 | 
				
			|||||||
                Cooldown = ThiefCooldown.Minutes * 1<mins>
 | 
					                Cooldown = ThiefCooldown.Minutes * 1<mins>
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            let actions = thief |> Player.removeExpiredActions |> fun p -> Array.append [| stole |] p.Events
 | 
					            let actions = thief |> Player.removeExpiredActions |> fun p -> Array.append [| stole |] p.Events
 | 
				
			||||||
            do! DbService.updatePlayer { thief with Bank = thief.Bank + prize ; Events = actions }
 | 
					            do! DbService.updatePlayer GuildEnvironment.pgDb { thief with Bank = thief.Bank + prize ; Events = actions }
 | 
				
			||||||
 | 
					                |> Async.Ignore
 | 
				
			||||||
        | false ->
 | 
					        | false ->
 | 
				
			||||||
            let embed = getResultEmbed' WentToPrison
 | 
					            let embed = getResultEmbed' WentToPrison
 | 
				
			||||||
            do! DbService.updatePlayer { thief with Events = Array.append [| stealAction PlayerEventResult.Neutral |] thief.Events }
 | 
					            do! DbService.updatePlayer GuildEnvironment.pgDb { thief with Events = Array.append [| stealAction PlayerEventResult.Neutral |] thief.Events }
 | 
				
			||||||
 | 
					                |> Async.Ignore
 | 
				
			||||||
            do! Messaging.sendFollowUpEmbed ctx (embed.Build())
 | 
					            do! Messaging.sendFollowUpEmbed ctx (embed.Build())
 | 
				
			||||||
            do! Async.Sleep 2000
 | 
					            do! Async.Sleep 2000
 | 
				
			||||||
            let role = ctx.GetGuild().GetRole(GuildEnvironment.rolePrisoner)
 | 
					            let role = ctx.GetGuild().GetRole(GuildEnvironment.rolePrisoner)
 | 
				
			||||||
 | 
				
			|||||||
@ -152,7 +152,8 @@ let handleHack (ctx : IDiscordContext) =
 | 
				
			|||||||
//        let isFirstTrainer = player.Achievements |> Seq.contains trainerAchievement |> not
 | 
					//        let isFirstTrainer = player.Achievements |> Seq.contains trainerAchievement |> not
 | 
				
			||||||
        let isFirstTrainer = true
 | 
					        let isFirstTrainer = true
 | 
				
			||||||
        if isFirstTrainer then
 | 
					        if isFirstTrainer then
 | 
				
			||||||
            do! DbService.addAchievement player.DiscordId trainerAchievement
 | 
					            do! DbService.addAchievement GuildEnvironment.pgDb player.DiscordId trainerAchievement
 | 
				
			||||||
 | 
					                |> Async.Ignore
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            sb.Append($"I'm going to gift you a hack,`{defaultHack.Name}` and a shield, `{defaultShield.Name}`") |> ignore
 | 
					            sb.Append($"I'm going to gift you a hack,`{defaultHack.Name}` and a shield, `{defaultShield.Name}`") |> ignore
 | 
				
			||||||
            sb.Append(", you'll need em to survive\n\n") |> ignore
 | 
					            sb.Append(", you'll need em to survive\n\n") |> ignore
 | 
				
			||||||
@ -179,7 +180,8 @@ let handleArsenal (ctx : IDiscordContext) =
 | 
				
			|||||||
            else
 | 
					            else
 | 
				
			||||||
                Player.removeExpiredActions player
 | 
					                Player.removeExpiredActions player
 | 
				
			||||||
        if not hasStockWeapons then
 | 
					        if not hasStockWeapons then
 | 
				
			||||||
            do! DbService.updatePlayer updatedPlayer
 | 
					            do! DbService.updatePlayer GuildEnvironment.pgDb updatedPlayer
 | 
				
			||||||
 | 
					                |> Async.Ignore
 | 
				
			||||||
        let embed = Embeds.getArsenalEmbed updatedPlayer
 | 
					        let embed = Embeds.getArsenalEmbed updatedPlayer
 | 
				
			||||||
        do! ctx.FollowUp(embed) |> Async.AwaitTask
 | 
					        do! ctx.FollowUp(embed) |> Async.AwaitTask
 | 
				
			||||||
        // TODO DB:
 | 
					        // TODO DB:
 | 
				
			||||||
 | 
				
			|||||||
@ -3,9 +3,8 @@
 | 
				
			|||||||
open Degenz.Types
 | 
					open Degenz.Types
 | 
				
			||||||
 | 
					
 | 
				
			||||||
open System
 | 
					open System
 | 
				
			||||||
open MongoDB.Bson
 | 
					//open MongoDB.Bson
 | 
				
			||||||
open MongoDB.Bson.Serialization
 | 
					//open MongoDB.Driver
 | 
				
			||||||
open MongoDB.Driver
 | 
					 | 
				
			||||||
open Npgsql.FSharp
 | 
					open Npgsql.FSharp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type User = {
 | 
					type User = {
 | 
				
			||||||
@ -16,17 +15,7 @@ type User = {
 | 
				
			|||||||
    Inventory : int array
 | 
					    Inventory : int array
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let mongo = MongoClient(Environment.GetEnvironmentVariable("CONN_STRING"))
 | 
					let mapBack user : PlayerData =
 | 
				
			||||||
let db = mongo.GetDatabase("degenz")
 | 
					 | 
				
			||||||
let players = db.GetCollection<BsonDocument>("players")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
let tryWithDefault (bson : BsonDocument) field (defaultValue : 'a) (map : BsonValue -> 'a) =
 | 
					 | 
				
			||||||
    try
 | 
					 | 
				
			||||||
        let result , bval = bson.TryGetValue(field)
 | 
					 | 
				
			||||||
        if result then map bval else defaultValue
 | 
					 | 
				
			||||||
    with _ -> defaultValue
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
let mapBack user (bson : BsonDocument) : PlayerData =
 | 
					 | 
				
			||||||
    { DiscordId = user.DiscordId
 | 
					    { DiscordId = user.DiscordId
 | 
				
			||||||
      Name = user.Name
 | 
					      Name = user.Name
 | 
				
			||||||
      Inventory =
 | 
					      Inventory =
 | 
				
			||||||
@ -38,11 +27,7 @@ let mapBack user (bson : BsonDocument) : PlayerData =
 | 
				
			|||||||
                  | Some i -> [| i  |]
 | 
					                  | Some i -> [| i  |]
 | 
				
			||||||
                  | None -> [||])
 | 
					                  | None -> [||])
 | 
				
			||||||
          |> Array.concat
 | 
					          |> Array.concat
 | 
				
			||||||
      Events = tryWithDefault bson "Events" [||] (fun v ->
 | 
					      Events = [||]
 | 
				
			||||||
              v.AsBsonArray
 | 
					 | 
				
			||||||
              |> Seq.map (fun (bv : BsonValue) ->
 | 
					 | 
				
			||||||
                  BsonSerializer.Deserialize<PlayerEvent>(bv.ToBsonDocument()))
 | 
					 | 
				
			||||||
              |> Seq.toArray)
 | 
					 | 
				
			||||||
      Traits = { PlayerTraits.empty with Strength = user.Strength }
 | 
					      Traits = { PlayerTraits.empty with Strength = user.Strength }
 | 
				
			||||||
//      Achievements =
 | 
					//      Achievements =
 | 
				
			||||||
//          tryWithDefault bson "Achievements" [||] (fun v ->
 | 
					//          tryWithDefault bson "Achievements" [||] (fun v ->
 | 
				
			||||||
@ -53,47 +38,59 @@ let mapBack user (bson : BsonDocument) : PlayerData =
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
let tryFindPlayer connStr (id : uint64) =
 | 
					let tryFindPlayer connStr (id : uint64) =
 | 
				
			||||||
    async {
 | 
					    async {
 | 
				
			||||||
        let filter = Builders<BsonDocument>.Filter.Eq("Player.DiscordId", id)
 | 
					 | 
				
			||||||
        let! player = players.FindAsync<BsonDocument>(filter) |> Async.AwaitTask
 | 
					 | 
				
			||||||
        let! user =
 | 
					        let! user =
 | 
				
			||||||
            connStr
 | 
					            connStr
 | 
				
			||||||
            |> Sql.connect
 | 
					            |> Sql.connect
 | 
				
			||||||
            |> Sql.query "SELECT * FROM users WHERE discordId = @did"
 | 
					            |> Sql.query "SELECT * FROM users WHERE discord_id = @did"
 | 
				
			||||||
            |> Sql.parameters [ "did", Sql.int64 (int64 id) ]
 | 
					            |> Sql.parameters [ "did", Sql.string (string id) ]
 | 
				
			||||||
            |> Sql.executeAsync (fun read ->
 | 
					            |> Sql.executeAsync (fun read ->
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    DiscordId = read.int64 "discordId" |> uint64
 | 
					                    DiscordId = read.string "discord_id" |> uint64
 | 
				
			||||||
                    Name = read.string "displayName"
 | 
					                    Name = read.string "display_name"
 | 
				
			||||||
                    Bank = read.int "gbt" * 1<GBT>
 | 
					                    Bank = read.int "gbt" * 1<GBT>
 | 
				
			||||||
                    Strength = read.int "strength"
 | 
					                    Strength = read.int "strength"
 | 
				
			||||||
                    Inventory = read.intArray "inventory"
 | 
					                    Inventory = read.intArray "inventory"
 | 
				
			||||||
                })
 | 
					                })
 | 
				
			||||||
            |> Async.AwaitTask
 | 
					            |> Async.AwaitTask
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        match player.FirstOrDefault() , List.tryHead user with
 | 
					        match List.tryHead user with
 | 
				
			||||||
        | null , _
 | 
					        | None -> return None
 | 
				
			||||||
        | _ , None -> return None
 | 
					        | Some u -> return Some (mapBack u)
 | 
				
			||||||
        | p , Some u ->
 | 
					 | 
				
			||||||
            let v = p.GetValue("Player")
 | 
					 | 
				
			||||||
            let playerData = mapBack u (v.ToBsonDocument())
 | 
					 | 
				
			||||||
            return Some playerData
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let insertNewPlayer (player : PlayerData) =
 | 
					//let insertNewPlayer (player : PlayerData) =
 | 
				
			||||||
    async {
 | 
					//    async {
 | 
				
			||||||
        do! BsonDocument("Player", player.ToBsonDocument()) |> players.InsertOneAsync |> Async.AwaitTask
 | 
					//        do! BsonDocument("Player", player.ToBsonDocument()) |> players.InsertOneAsync |> Async.AwaitTask
 | 
				
			||||||
    }
 | 
					//    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let updatePlayer (player : PlayerData) =
 | 
					let updatePlayer connStr (player : PlayerData) =
 | 
				
			||||||
    async {
 | 
					    connStr
 | 
				
			||||||
        let filter = Builders<BsonDocument>.Filter.Eq("Player.DiscordId", player.DiscordId)
 | 
					    |> Sql.connect
 | 
				
			||||||
        let update = Builders<BsonDocument>.Update.Set("Player", player.ToBsonDocument())
 | 
					    |> Sql.query ("UPDATE users " +
 | 
				
			||||||
        do! players.UpdateOneAsync(filter, update) |> Async.AwaitTask |> Async.Ignore
 | 
					                 "SET bank = @bank, strength = @str, inventory = @inv " +
 | 
				
			||||||
    }
 | 
					                 "WHERE discordId = @did")
 | 
				
			||||||
 | 
					    |> Sql.parameters [
 | 
				
			||||||
 | 
					        "did", Sql.string (string player.DiscordId)
 | 
				
			||||||
 | 
					        "bank", Sql.int (int player.Bank)
 | 
				
			||||||
 | 
					        "str", Sql.int (int player.Traits.Strength)
 | 
				
			||||||
 | 
					        "inv", Sql.intArray (player.Inventory |> Array.map (fun i -> i.Id))
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					    |> Sql.executeNonQueryAsync
 | 
				
			||||||
 | 
					    |> Async.AwaitTask
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let addAchievement (id : uint64) (achievement : string) =
 | 
					//let addAchievement (id : uint64) (achievement : string) =
 | 
				
			||||||
    async {
 | 
					//    async {
 | 
				
			||||||
        let filter = Builders<BsonDocument>.Filter.Eq("Player.DiscordId", id)
 | 
					//        let filter = Builders<BsonDocument>.Filter.Eq("Player.DiscordId", id)
 | 
				
			||||||
        let update = Builders<BsonDocument>.Update.Push("Player.Achievements", achievement)
 | 
					//        let update = Builders<BsonDocument>.Update.Push("Player.Achievements", achievement)
 | 
				
			||||||
        return! players.UpdateOneAsync(filter, update) |> Async.AwaitTask |> Async.Ignore
 | 
					//        return! players.UpdateOneAsync(filter, update) |> Async.AwaitTask |> Async.Ignore
 | 
				
			||||||
    }
 | 
					//    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let addAchievement connStr (did : uint64) (achievement : string) =
 | 
				
			||||||
 | 
					    connStr
 | 
				
			||||||
 | 
					    |> Sql.connect
 | 
				
			||||||
 | 
					    |> Sql.query ("WITH ach_id AS (INSERT INTO achievement (symbol) VALUES (@symbol)), " +
 | 
				
			||||||
 | 
					                  "     usr_id AS (SELECT id FROM user WHERE discord_id = @did" +
 | 
				
			||||||
 | 
					                  "INSERT INTO user_achievements_achievement (user_id, achievement_id) VALUES (usr_id, ach_id) ")
 | 
				
			||||||
 | 
					    |> Sql.parameters [ ( "did" , Sql.string (string did) ) ; ( "achievement", Sql.string achievement ) ]
 | 
				
			||||||
 | 
					    |> Sql.executeNonQueryAsync
 | 
				
			||||||
 | 
					    |> Async.AwaitTask
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user