Fix some bugs with the timestamps

This commit is contained in:
Joseph Ferano 2022-02-24 00:22:59 +07:00
parent 25654c9b8c
commit cc39bb26a0
4 changed files with 29 additions and 17 deletions

View File

@ -76,7 +76,7 @@ module Player =
let getShields (player : PlayerData) = getItems ItemType.Shield player let getShields (player : PlayerData) = getItems ItemType.Shield player
let getHackEvents player = let getHackEvents player =
player.Events player.Events
|> Array.filter (fun act -> match act.Type with PlayerEventType.Hacking _ -> true | _ -> false) |> Array.filter (fun act -> match act.Type with PlayerEventType.Hacking h -> h.IsInstigator | _ -> false)
let getShieldEvents player = let getShieldEvents player =
player.Events player.Events
|> Array.filter (fun act -> match act.Type with PlayerEventType.Shielding _ -> true | _ -> false) |> Array.filter (fun act -> match act.Type with PlayerEventType.Shielding _ -> true | _ -> false)

View File

@ -15,25 +15,29 @@ let checkPlayerIsAttackingThemselves defender attacker =
| false -> Ok attacker | false -> Ok attacker
let checkAlreadyHackedTarget defender attacker = let checkAlreadyHackedTarget defender attacker =
defender.Events defender
|> Player.removeExpiredActions
|> fun d -> d.Events
|> Array.tryFind (fun event -> |> Array.tryFind (fun event ->
match event.Type with match event.Type with
| Hacking h -> h.Adversary.Id = attacker.DiscordId && h.IsInstigator = false | Hacking h -> h.Adversary.Id = attacker.DiscordId && h.IsInstigator = false
| _ -> false) | _ -> false)
|> function |> function
| Some event -> | Some event ->
let cooldown = getTimeText true Game.SameTargetAttackCooldown event.Timestamp let cooldown = TimeSpan.FromMinutes(int event.Cooldown)
Error $"You can only hack the same target once every {Game.SameTargetAttackCooldown.Hours} hours, wait {cooldown} to attempt another hack on <@{defender.DiscordId}>." let cooldownText = getTimeText true cooldown event.Timestamp
Error $"You can only hack the same target once every {cooldown.Hours} hours, wait {cooldownText} to attempt another hack on <@{defender.DiscordId}>."
| None -> Ok attacker | None -> Ok attacker
let checkWeaponHasCooldown (weapon : Item) attacker = let checkWeaponHasCooldown (weapon : Item) attacker =
attacker.Events attacker.Events
|> Array.tryPick (fun a -> |> Array.tryFind (fun a ->
match a.Type with match a.Type with
| Hacking h -> if h.HackId = weapon.Id then Some ( h , a ) else None | Hacking h -> h.HackId = weapon.Id
| _ -> None) | Shielding id -> id = weapon.Id
| _ -> false)
|> function |> function
| Some ( _ , event ) -> | Some event ->
let cooldown = getTimeText true (TimeSpan.FromMinutes(int event.Cooldown)) event.Timestamp let cooldown = getTimeText true (TimeSpan.FromMinutes(int event.Cooldown)) event.Timestamp
Error $"{weapon.Name} is still active, it will expire in {cooldown}." Error $"{weapon.Name} is still active, it will expire in {cooldown}."
| None -> Ok attacker | None -> Ok attacker
@ -86,10 +90,12 @@ let updateCombatants successfulHack (attacker : PlayerData) (defender : PlayerDa
} }
{ Type = Hacking hackEvent { Type = Hacking hackEvent
Timestamp = DateTime.UtcNow Timestamp = DateTime.UtcNow
Cooldown = if isDefenderEvent then Game.SameTargetAttackCooldown.Minutes * 1<mins> else hack.Cooldown } Cooldown = if isDefenderEvent then int Game.SameTargetAttackCooldown.TotalMinutes * 1<mins> else hack.Cooldown }
[ DbService.updatePlayer GuildEnvironment.pgDb <| updatePlayer prize (event false) attacker [ DbService.updatePlayer GuildEnvironment.pgDb <| updatePlayer prize (event false) attacker
DbService.updatePlayer GuildEnvironment.pgDb <| updatePlayer -prize (event true) defender ] DbService.updatePlayer GuildEnvironment.pgDb <| updatePlayer -prize (event true) defender
DbService.addPlayerEvent GuildEnvironment.pgDb attacker.DiscordId (event false)
DbService.addPlayerEvent GuildEnvironment.pgDb defender.DiscordId (event true) ]
|> Async.Parallel |> Async.Parallel
|> Async.Ignore |> Async.Ignore
@ -192,7 +198,9 @@ let handleDefense (ctx : IDiscordContext) =
Cooldown = shield.Cooldown Cooldown = shield.Cooldown
Timestamp = DateTime.UtcNow Timestamp = DateTime.UtcNow
} }
do! DbService.updatePlayer GuildEnvironment.pgDb <| { p with Events = Array.append [| defense |] p.Events } do! DbService.updatePlayer GuildEnvironment.pgDb p
|> Async.Ignore
do! DbService.addPlayerEvent GuildEnvironment.pgDb p.DiscordId defense
|> Async.Ignore |> 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

View File

@ -144,8 +144,8 @@ let handleHack (ctx : IDiscordContext) =
let sb = StringBuilder("Here, ") let sb = StringBuilder("Here, ")
let! isFirstTrainer = DbService.checkHasAchievement GuildEnvironment.pgDb player.DiscordId trainerAchievement let! completed = DbService.checkHasAchievement GuildEnvironment.pgDb player.DiscordId trainerAchievement
if isFirstTrainer then if not completed then
do! DbService.addAchievement GuildEnvironment.pgDb player.DiscordId trainerAchievement do! DbService.addAchievement GuildEnvironment.pgDb player.DiscordId trainerAchievement
|> Async.Ignore |> Async.Ignore
@ -174,13 +174,17 @@ let handleArsenal (ctx : IDiscordContext) =
else else
Player.removeExpiredActions player Player.removeExpiredActions player
if not hasStockWeapons then if not hasStockWeapons then
do! DbService.updatePlayer GuildEnvironment.pgDb updatedPlayer do!
[ DbService.addPlayerEvent GuildEnvironment.pgDb player.DiscordId TrainerEvents.[0]
DbService.addPlayerEvent GuildEnvironment.pgDb player.DiscordId TrainerEvents.[1]
DbService.updatePlayer GuildEnvironment.pgDb updatedPlayer ]
|> Async.Parallel
|> 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
let! isFirstTrainer = DbService.checkHasAchievement GuildEnvironment.pgDb player.DiscordId trainerAchievement let! completed = DbService.checkHasAchievement GuildEnvironment.pgDb player.DiscordId trainerAchievement
if isFirstTrainer then if not completed 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

View File

@ -35,7 +35,7 @@ let getPlayerEvents connStr (player : PlayerData) =
|> Sql.query """ |> Sql.query """
WITH usr AS (SELECT id FROM "user" WHERE discord_id = @did) 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 SELECT event_type, success, is_instigator, item_id, cooldown, adversary_id, adversary_name, created_at
FROM player_event ,usr WHERE user_id = usr.id; FROM player_event ,usr WHERE user_id = usr.id and created_at > NOW() at time zone 'utc' - INTERVAL '24 HOURS';
""" """
|> Sql.executeAsync (fun read -> |> Sql.executeAsync (fun read ->
match read.string "event_type" with match read.string "event_type" with