Read PlayerEvents from DB and check if achievement exists
This commit is contained in:
		
							parent
							
								
									31de79f1b6
								
							
						
					
					
						commit
						25654c9b8c
					
				@ -100,7 +100,8 @@ module Arsenal =
 | 
				
			|||||||
    let actionFormat (actions : PlayerEvent array) =
 | 
					    let actionFormat (actions : PlayerEvent array) =
 | 
				
			||||||
        match actions with
 | 
					        match actions with
 | 
				
			||||||
        | [||] -> "None"
 | 
					        | [||] -> "None"
 | 
				
			||||||
        | _ -> actions
 | 
					        | acts ->
 | 
				
			||||||
 | 
					            acts
 | 
				
			||||||
            |> Array.map (fun act ->
 | 
					            |> Array.map (fun act ->
 | 
				
			||||||
                match act.Type with
 | 
					                match act.Type with
 | 
				
			||||||
                | Hacking h ->
 | 
					                | Hacking h ->
 | 
				
			||||||
@ -112,7 +113,7 @@ module Arsenal =
 | 
				
			|||||||
                    let cooldown = Messaging.getTimeText true (System.TimeSpan.FromMinutes(int act.Cooldown)) act.Timestamp
 | 
					                    let cooldown = Messaging.getTimeText true (System.TimeSpan.FromMinutes(int act.Cooldown)) act.Timestamp
 | 
				
			||||||
                    $"{item.Name} Shield active for {cooldown}"
 | 
					                    $"{item.Name} Shield active for {cooldown}"
 | 
				
			||||||
                | _ -> "")
 | 
					                | _ -> "")
 | 
				
			||||||
            |> Array.filter (System.String.IsNullOrWhiteSpace)
 | 
					            |> Array.filter (System.String.IsNullOrWhiteSpace >> not)
 | 
				
			||||||
            |> String.concat "\n"
 | 
					            |> String.concat "\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let statusFormat p =
 | 
					    let statusFormat p =
 | 
				
			||||||
 | 
				
			|||||||
@ -144,9 +144,7 @@ let handleHack (ctx : IDiscordContext) =
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        let sb = StringBuilder("Here, ")
 | 
					        let sb = StringBuilder("Here, ")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // TODO DB:
 | 
					        let! isFirstTrainer = DbService.checkHasAchievement GuildEnvironment.pgDb player.DiscordId trainerAchievement
 | 
				
			||||||
//        let isFirstTrainer = player.Achievements |> Seq.contains trainerAchievement |> not
 | 
					 | 
				
			||||||
        let isFirstTrainer = true
 | 
					 | 
				
			||||||
        if isFirstTrainer then
 | 
					        if isFirstTrainer then
 | 
				
			||||||
            do! DbService.addAchievement GuildEnvironment.pgDb player.DiscordId trainerAchievement
 | 
					            do! DbService.addAchievement GuildEnvironment.pgDb player.DiscordId trainerAchievement
 | 
				
			||||||
                |> Async.Ignore
 | 
					                |> Async.Ignore
 | 
				
			||||||
@ -180,9 +178,9 @@ let handleArsenal (ctx : IDiscordContext) =
 | 
				
			|||||||
                |> Async.Ignore
 | 
					                |> 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:
 | 
					
 | 
				
			||||||
//        if not (player.Achievements |> Array.contains trainerAchievement) then
 | 
					        let! isFirstTrainer = DbService.checkHasAchievement GuildEnvironment.pgDb player.DiscordId trainerAchievement
 | 
				
			||||||
        if true then
 | 
					        if isFirstTrainer then
 | 
				
			||||||
            do! Async.Sleep 3000
 | 
					            do! Async.Sleep 3000
 | 
				
			||||||
            let rewards = [ $"{defaultHack.Name} Hack" ; $"{defaultShield.Name} Shield" ]
 | 
					            let rewards = [ $"{defaultHack.Name} Hack" ; $"{defaultShield.Name} Shield" ]
 | 
				
			||||||
            let embed = Embeds.getAchievementEmbed rewards "You completed the Training Dojo and collected loot." trainerAchievement
 | 
					            let embed = Embeds.getAchievementEmbed rewards "You completed the Training Dojo and collected loot." trainerAchievement
 | 
				
			||||||
 | 
				
			|||||||
@ -28,33 +28,57 @@ let mapBack user : PlayerData =
 | 
				
			|||||||
      Bank = user.Bank
 | 
					      Bank = user.Bank
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let getPlayerEvents connStr (player : PlayerData) =
 | 
				
			||||||
 | 
					    connStr
 | 
				
			||||||
 | 
					    |> Sql.connect
 | 
				
			||||||
 | 
					    |> Sql.parameters [ "did", Sql.string (string player.DiscordId) ]
 | 
				
			||||||
 | 
					    |> Sql.query """
 | 
				
			||||||
 | 
					            WITH usr AS (SELECT id FROM "user" WHERE discord_id = @did)
 | 
				
			||||||
 | 
					            SELECT event_type, success, is_instigator, item_id, cooldown, adversary_id, adversary_name, created_at
 | 
				
			||||||
 | 
					            FROM player_event ,usr WHERE user_id = usr.id;
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					    |> Sql.executeAsync (fun read ->
 | 
				
			||||||
 | 
					            match read.string "event_type" with
 | 
				
			||||||
 | 
					            | "Hacking" ->
 | 
				
			||||||
 | 
					                Hacking {
 | 
				
			||||||
 | 
					                    IsInstigator = read.bool "is_instigator"
 | 
				
			||||||
 | 
					                    Success = read.bool "success"
 | 
				
			||||||
 | 
					                    Adversary = { Id = read.string "adversary_id" |> uint64 ; Name = read.string "adversary_name" }
 | 
				
			||||||
 | 
					                    HackId = read.int "item_id"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            | "Shielding" -> Shielding (read.int "item_id")
 | 
				
			||||||
 | 
					            | "Stealing" -> Stealing ( read.bool "is_instigator" , { Id = read.string "adversary_id" |> uint64 ; Name = read.string "adversary_name" } )
 | 
				
			||||||
 | 
					            | _ -> Imprison
 | 
				
			||||||
 | 
					            |> fun t ->
 | 
				
			||||||
 | 
					                let date = read.dateTimeOrNone "created_at" |> Option.defaultValue DateTime.UtcNow
 | 
				
			||||||
 | 
					                { Type = t ; Cooldown = read.int "cooldown" * 1<mins> ; Timestamp = date }
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    |> Async.AwaitTask
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let tryFindPlayer connStr (discordId : uint64) =
 | 
					let tryFindPlayer connStr (discordId : uint64) =
 | 
				
			||||||
    async {
 | 
					    async {
 | 
				
			||||||
        try
 | 
					        let! user =
 | 
				
			||||||
            let! user =
 | 
					            connStr
 | 
				
			||||||
                connStr
 | 
					            |> Sql.connect
 | 
				
			||||||
                |> Sql.connect
 | 
					            |> Sql.parameters [ "did", Sql.string (string discordId) ]
 | 
				
			||||||
                |> Sql.query """
 | 
					            |> Sql.query """
 | 
				
			||||||
                      SELECT discord_id, display_name, gbt, strength, inventory
 | 
					                    SELECT discord_id, display_name, gbt, strength, inventory FROM "user" WHERE discord_id = @did
 | 
				
			||||||
                      FROM "user" WHERE discord_id = @did")
 | 
					                """
 | 
				
			||||||
                  """
 | 
					            |> Sql.executeAsync (fun read ->
 | 
				
			||||||
                |> Sql.parameters [ "did", Sql.string (string discordId) ]
 | 
					                {
 | 
				
			||||||
                |> Sql.executeAsync (fun read ->
 | 
					                    DiscordId = read.string "discord_id" |> uint64
 | 
				
			||||||
                    {
 | 
					                    Name = read.string "display_name"
 | 
				
			||||||
                        DiscordId = read.string "discord_id" |> uint64
 | 
					                    Bank = read.int "gbt" * 1<GBT>
 | 
				
			||||||
                        Name = read.string "display_name"
 | 
					                    Strength = read.int "strength"
 | 
				
			||||||
                        Bank = read.int "gbt" * 1<GBT>
 | 
					                    Inventory = read.intArray "inventory"
 | 
				
			||||||
                        Strength = read.int "strength"
 | 
					                })
 | 
				
			||||||
                        Inventory = read.intArray "inventory"
 | 
					            |> Async.AwaitTask
 | 
				
			||||||
                    })
 | 
					        match List.tryHead user with
 | 
				
			||||||
                |> Async.AwaitTask
 | 
					        | None -> return None
 | 
				
			||||||
 | 
					        | Some u ->
 | 
				
			||||||
            match List.tryHead user with
 | 
					            let player = mapBack u
 | 
				
			||||||
            | None -> return None
 | 
					            let! events = getPlayerEvents connStr player
 | 
				
			||||||
            | Some u -> return Some (mapBack u)
 | 
					            return Some { player with Events = events |> List.toArray }
 | 
				
			||||||
        with e ->
 | 
					 | 
				
			||||||
            printfn $"{e.Message}"
 | 
					 | 
				
			||||||
            return None
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let updatePlayer connStr (player : PlayerData) =
 | 
					let updatePlayer connStr (player : PlayerData) =
 | 
				
			||||||
@ -68,7 +92,7 @@ let updatePlayer connStr (player : PlayerData) =
 | 
				
			|||||||
    ]
 | 
					    ]
 | 
				
			||||||
    |> Sql.query """
 | 
					    |> Sql.query """
 | 
				
			||||||
           UPDATE "user" SET gbt = @gbt, strength = @str, inventory = @inv
 | 
					           UPDATE "user" SET gbt = @gbt, strength = @str, inventory = @inv
 | 
				
			||||||
           WHERE discord_id = @did")
 | 
					           WHERE discord_id = @did
 | 
				
			||||||
       """
 | 
					       """
 | 
				
			||||||
    |> Sql.executeNonQueryAsync
 | 
					    |> Sql.executeNonQueryAsync
 | 
				
			||||||
    |> Async.AwaitTask
 | 
					    |> Async.AwaitTask
 | 
				
			||||||
@ -76,15 +100,34 @@ let updatePlayer connStr (player : PlayerData) =
 | 
				
			|||||||
let addAchievement connStr (did : uint64) (achievement : string) =
 | 
					let addAchievement connStr (did : uint64) (achievement : string) =
 | 
				
			||||||
    connStr
 | 
					    connStr
 | 
				
			||||||
    |> Sql.connect
 | 
					    |> Sql.connect
 | 
				
			||||||
 | 
					    |> Sql.parameters
 | 
				
			||||||
 | 
					        [ ( "did" , Sql.string (string did) )
 | 
				
			||||||
 | 
					          ( "symbol", Sql.string achievement ) ]
 | 
				
			||||||
    |> Sql.query """
 | 
					    |> Sql.query """
 | 
				
			||||||
           WITH ach AS (INSERT INTO achievement (symbol) VALUES (@symbol) RETURNING id),
 | 
					           WITH ach AS (INSERT INTO achievement (symbol) VALUES (@symbol) RETURNING id),
 | 
				
			||||||
                usr AS (SELECT id FROM "user" WHERE discord_id = @did)
 | 
					                usr AS (SELECT id FROM "user" WHERE discord_id = @did)
 | 
				
			||||||
           INSERT INTO user_achievements_achievement (user_id, achievement_id) SELECT usr.id, ach.id FROM usr, ach")
 | 
					           INSERT INTO user_achievements_achievement (user_id, achievement_id) SELECT usr.id, ach.id FROM usr, ach
 | 
				
			||||||
       """
 | 
					       """
 | 
				
			||||||
    |> Sql.parameters [ ( "did" , Sql.string (string did) ) ; ( "achievement", Sql.string achievement ) ]
 | 
					 | 
				
			||||||
    |> Sql.executeNonQueryAsync
 | 
					    |> Sql.executeNonQueryAsync
 | 
				
			||||||
    |> Async.AwaitTask
 | 
					    |> Async.AwaitTask
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let checkHasAchievement connStr (did : uint64) (achievement : string) = async {
 | 
				
			||||||
 | 
					    let! result =
 | 
				
			||||||
 | 
					        connStr
 | 
				
			||||||
 | 
					        |> Sql.connect
 | 
				
			||||||
 | 
					        |> Sql.parameters
 | 
				
			||||||
 | 
					            [ ( "did" , Sql.string (string did) )
 | 
				
			||||||
 | 
					              ( "symbol", Sql.string achievement ) ]
 | 
				
			||||||
 | 
					        |> Sql.query """
 | 
				
			||||||
 | 
					                WITH ach AS (SELECT id FROM achievement WHERE symbol = @symbol),
 | 
				
			||||||
 | 
					                     usr AS (SELECT id FROM "user" WHERE discord_id = @did)
 | 
				
			||||||
 | 
					                SELECT achievement_id FROM user_achievements_achievement, ach, usr WHERE user_id = usr.id and achievement_id = ach.id;
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        |> Sql.executeAsync (fun read -> read.int "achievement_id")
 | 
				
			||||||
 | 
					        |> Async.AwaitTask
 | 
				
			||||||
 | 
					    return List.isEmpty result |> not
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let addPlayerEvent connStr (did : uint64) (playerEvent : PlayerEvent) =
 | 
					let addPlayerEvent connStr (did : uint64) (playerEvent : PlayerEvent) =
 | 
				
			||||||
    let sqlParams , query =
 | 
					    let sqlParams , query =
 | 
				
			||||||
        match playerEvent.Type with
 | 
					        match playerEvent.Type with
 | 
				
			||||||
@ -135,7 +178,7 @@ let addPlayerEvent connStr (did : uint64) (playerEvent : PlayerEvent) =
 | 
				
			|||||||
            """
 | 
					            """
 | 
				
			||||||
                WITH usr AS (SELECT id FROM "user" WHERE discord_id = @did)
 | 
					                WITH usr AS (SELECT id FROM "user" WHERE discord_id = @did)
 | 
				
			||||||
                INSERT INTO player_event (event_type, cooldown, user_id)
 | 
					                INSERT INTO player_event (event_type, cooldown, user_id)
 | 
				
			||||||
                SELECT 'Stealing', @cooldown, usr.id FROM usr
 | 
					                SELECT 'Imprison', @cooldown, usr.id FROM usr
 | 
				
			||||||
            """
 | 
					            """
 | 
				
			||||||
    connStr
 | 
					    connStr
 | 
				
			||||||
    |> Sql.connect
 | 
					    |> Sql.connect
 | 
				
			||||||
 | 
				
			|||||||
@ -122,10 +122,10 @@ module Types =
 | 
				
			|||||||
        Inventory : Item array
 | 
					        Inventory : Item array
 | 
				
			||||||
        Events : PlayerEvent array
 | 
					        Events : PlayerEvent array
 | 
				
			||||||
        Traits : PlayerTraits
 | 
					        Traits : PlayerTraits
 | 
				
			||||||
//        Achievements : string array
 | 
					 | 
				
			||||||
//        XP : int
 | 
					 | 
				
			||||||
        Bank : int<GBT>
 | 
					        Bank : int<GBT>
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					//        Achievements : string array
 | 
				
			||||||
 | 
					//        XP : int
 | 
				
			||||||
    with member this.basicPlayer = { Id = this.DiscordId ; Name = this.Name }
 | 
					    with member this.basicPlayer = { Id = this.DiscordId ; Name = this.Name }
 | 
				
			||||||
         static member empty =
 | 
					         static member empty =
 | 
				
			||||||
             { DiscordId = 0uL
 | 
					             { DiscordId = 0uL
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user