Fix a few bugs and disable inviter

This commit is contained in:
Joseph Ferano 2022-03-05 19:55:54 +07:00
parent 81cd471a7f
commit eba589746b
7 changed files with 51 additions and 37 deletions

View File

@ -90,7 +90,7 @@ GuildEnvironment.botUserArmory <- Some storeBot.CurrentUser
stealBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously stealBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously
inviterBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously //inviterBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously
//let channel = hackerBattleBot.GetChannelAsync(1234uL) |> Async.AwaitTask |> Async.RunSynchronously //let channel = hackerBattleBot.GetChannelAsync(1234uL) |> Async.AwaitTask |> Async.RunSynchronously
//channel.invi //channel.invi

View File

@ -57,8 +57,7 @@ let pickDefense actionId player isTrainer =
.WithDescription("Pick a shield to protect yourself from hacks") .WithDescription("Pick a shield to protect yourself from hacks")
for shield in Inventory.getShields player.Inventory do for shield in Inventory.getShields player.Inventory do
// TODO: This is returning a decimal so look into why let hours = TimeSpan.FromMinutes(int shield.Cooldown).TotalHours |> int
let hours = TimeSpan.FromMinutes(int shield.Cooldown).TotalHours
let against = WeaponClass.getGoodAgainst(shield.Class) |> snd let against = WeaponClass.getGoodAgainst(shield.Class) |> snd
embed.AddField(shield.Item.Name, $"Active {hours} hours\nDefeats {against}", true) |> ignore embed.AddField(shield.Item.Name, $"Active {hours} hours\nDefeats {against}", true) |> ignore

View File

@ -43,7 +43,7 @@ module Inventory =
inventory |> List.choose (fun item -> match item with | Accessory a -> Some a | _ -> None) inventory |> List.choose (fun item -> match item with | Accessory a -> Some a | _ -> None)
module WeaponClass = module WeaponClass =
let SameTargetAttackCooldown = TimeSpan.FromHours(1) let SameTargetAttackCooldown = TimeSpan.FromHours(2)
let getClassButtonColor item = let getClassButtonColor item =
match ItemDetails.getClass item with match ItemDetails.getClass item with
@ -130,6 +130,6 @@ module Arsenal =
let statusFormat p = let statusFormat p =
let hacks = Player.getHackEvents p let hacks = Player.getHackEvents p
$"**Hacks:** {Inventory.getItemsByType ItemType.Hack p.Inventory |> battleItemFormat}\n $"**Hacks:** {Inventory.getItemsByType ItemType.Hack p.Inventory |> battleItemFormat}\n
**Shields:** {Inventory.getItemsByType ItemType.Hack p.Inventory |> battleItemFormat}\n **Shields:** {Inventory.getItemsByType ItemType.Shield p.Inventory |> battleItemFormat}\n
**Hack Attacks:**\n{hacks |> List.take (min hacks.Length 10) |> actionFormat}\n **Hack Attacks:**\n{hacks |> List.take (min hacks.Length 10) |> actionFormat}\n
**Active Shields:**\n{Player.getShieldEvents p |> actionFormat}" **Active Shields:**\n{Player.getShieldEvents p |> actionFormat}"

View File

@ -65,7 +65,7 @@ let checkPlayerHasShieldSlotsAvailable player =
| false -> Ok updatedPlayer | false -> Ok updatedPlayer
let checkTargetHasFunds target player = let checkTargetHasFunds target player =
match target.Bank = 0<GBT> with match target.Bank <= 0<GBT> with
| true -> Error $"Looks like the poor bastard has no $GBT... pick a different victim." | true -> Error $"Looks like the poor bastard has no $GBT... pick a different victim."
| false -> Ok player | false -> Ok player
@ -81,7 +81,6 @@ let runHackerBattle defender (hack : HackItem) =
|> List.contains Weak |> List.contains Weak
let updateCombatants successfulHack (attacker : PlayerData) (defender : PlayerData) (hack : HackItem) prize = let updateCombatants successfulHack (attacker : PlayerData) (defender : PlayerData) (hack : HackItem) prize =
// TODO: Look into the prizes and how we're handling them because it seems it can be negative
let updatePlayer amount attack p = let updatePlayer amount attack p =
{ p with Events = attack::p.Events ; Bank = max (p.Bank + amount) 0<GBT> } { p with Events = attack::p.Events ; Bank = max (p.Bank + amount) 0<GBT> }
let event isDefenderEvent = let event isDefenderEvent =
@ -162,6 +161,7 @@ let handleAttack (ctx : IDiscordContext) =
|> Player.removeExpiredActions |> Player.removeExpiredActions
|> checkAlreadyHackedTarget defender |> checkAlreadyHackedTarget defender
>>= checkPlayerOwnsWeapon hack.Item >>= checkPlayerOwnsWeapon hack.Item
>>= checkTargetHasFunds defender
>>= checkWeaponHasCooldown hack.Item >>= checkWeaponHasCooldown hack.Item
|> function |> function
| Ok atkr -> | Ok atkr ->

View File

@ -82,7 +82,7 @@ let checkVictimStealingCooldown defender attacker =
| None -> Ok attacker | None -> Ok attacker
let checkTargetHasFunds target player = let checkTargetHasFunds target player =
match target.Bank = 0<GBT> with match target.Bank <= 0<GBT> with
| true -> Error $"Looks like the poor bastard has no $GBT... pick a different victim." | true -> Error $"Looks like the poor bastard has no $GBT... pick a different victim."
| false -> Ok player | false -> Ok player

View File

@ -12,18 +12,21 @@ let Sensei = { Id = GuildEnvironment.botIdHackerBattle ; Name = "Sensei" }
let defaultHack = Armory.weapons |> Inventory.findHackById (int ItemId.Virus) let defaultHack = Armory.weapons |> Inventory.findHackById (int ItemId.Virus)
let defaultShield = Armory.weapons |> Inventory.findShieldById (int ItemId.Firewall) let defaultShield = Armory.weapons |> Inventory.findShieldById (int ItemId.Firewall)
let TrainerEvents = [ let HackEvent = {
{ Timestamp = System.DateTime.UtcNow Timestamp = System.DateTime.UtcNow
Cooldown = defaultHack.Cooldown Cooldown = 1<mins>
Type = Hacking { Type = Hacking {
Adversary = Sensei Adversary = Sensei
Success = true Success = true
IsInstigator = true IsInstigator = true
HackId = defaultHack.Item.Id } } HackId = defaultHack.Item.Id
{ Timestamp = System.DateTime.UtcNow }
}
let ShieldEvent = {
Timestamp = System.DateTime.UtcNow
Cooldown = defaultShield.Cooldown Cooldown = defaultShield.Cooldown
Type = Shielding defaultShield.Item.Id } Type = Shielding defaultShield.Item.Id
] }
let sendInitialEmbed (client : DiscordClient) = let sendInitialEmbed (client : DiscordClient) =
async { async {
@ -166,27 +169,39 @@ let handleHack (ctx : IDiscordContext) =
let handleArsenal (ctx : IDiscordContext) = let handleArsenal (ctx : IDiscordContext) =
PlayerInteractions.executePlayerAction ctx (fun player -> async { PlayerInteractions.executePlayerAction ctx (fun player -> async {
let hasStockWeapons = let hack =
// TODO: This didn't seem to work and someone was gifted both weapons when they already owned one if player.Inventory |> List.exists (fun i -> i.Id = defaultHack.Item.Id)
player.Inventory then []
|> List.choose (fun item -> if item.Id = defaultHack.Item.Id || item.Id = defaultShield.Item.Id then Some item else None) else [ Hack defaultHack ]
|> List.length > 0 let shield =
let updatedPlayer = if player.Inventory |> List.exists (fun i -> i.Id = defaultShield.Item.Id)
if not hasStockWeapons then { then []
else [ Shield defaultShield ]
let shieldEvent =
let hasShield =
player
|> Player.removeExpiredActions
|> fun p -> p.Events
|> List.exists (fun e -> match e.Type with Shielding shieldId -> shieldId = defaultShield.Item.Id | _ -> false)
if hasShield
then []
else [ ShieldEvent ]
let updatedPlayer = {
Player.removeExpiredActions player with Player.removeExpiredActions player with
Events = TrainerEvents @ player.Events Events = shieldEvent @ player.Events
Inventory = Hack defaultHack::Shield defaultShield::player.Inventory Inventory = hack @ shield @ player.Inventory
} }
else if not (List.isEmpty hack) || not (List.isEmpty shield) then
Player.removeExpiredActions player do! DbService.updatePlayer updatedPlayer |> Async.Ignore
if not hasStockWeapons then if not (List.isEmpty shieldEvent) then
do! do! DbService.addPlayerEvent player.DiscordId (List.head shieldEvent) |> Async.Ignore
[ DbService.addPlayerEvent player.DiscordId TrainerEvents.[0]
DbService.addPlayerEvent player.DiscordId TrainerEvents.[1] let playerForEmbed = {
DbService.updatePlayer updatedPlayer ] player with
|> Async.Parallel Events = [ HackEvent ; ShieldEvent ]
|> Async.Ignore Inventory = hack @ shield @ player.Inventory
let embed = Embeds.getArsenalEmbed updatedPlayer }
let embed = Embeds.getArsenalEmbed playerForEmbed
do! ctx.FollowUp(embed) |> Async.AwaitTask do! ctx.FollowUp(embed) |> Async.AwaitTask
let! completed = DbService.checkHasAchievement player.DiscordId trainerAchievement let! completed = DbService.checkHasAchievement player.DiscordId trainerAchievement

View File

@ -77,7 +77,7 @@
"Fields": [ "Fields": [
{ {
"Class": 2, "Class": 2,
"Cooldown": 380, "Cooldown": 360,
"Item": { "Item": {
"Id": 8, "Id": 8,
"Name": "Cypher", "Name": "Cypher",