Fix some bugs with the timestamps
This commit is contained in:
parent
25654c9b8c
commit
cc39bb26a0
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user