From ef8120e9c4f9c315d558165627d5a4adce02d85f Mon Sep 17 00:00:00 2001 From: Joseph Ferano Date: Mon, 30 May 2022 20:25:18 +0700 Subject: [PATCH 1/4] Delete queries that update stats --- Bot/DbService.fs | 35 ----------------------------------- Bot/Games/HackerBattle.fs | 6 ++---- Bot/Games/Thief.fs | 4 ++-- 3 files changed, 4 insertions(+), 41 deletions(-) diff --git a/Bot/DbService.fs b/Bot/DbService.fs index ba7b34a..872edb7 100644 --- a/Bot/DbService.fs +++ b/Bot/DbService.fs @@ -235,24 +235,6 @@ let getPlayerEvents (did : uint64) = ) |> Async.AwaitTask -let updatePlayerStats (player : PlayerData) = - connStr - |> Sql.connect - |> Sql.parameters - [ ( "did" , Sql.string (string player.DiscordId) ) - ( "strength", Sql.int player.Stats.Strength.Amount ) - ( "focus", Sql.int player.Stats.Focus.Amount ) - ( "charisma", Sql.int player.Stats.Charisma.Amount ) - ( "luck", Sql.int player.Stats.Luck.Amount ) ] - |> Sql.query """ - WITH usr AS (SELECT id FROM "user" WHERE discord_id = @did) - UPDATE player_stat SET strength = @strength, focus = @focus, charisma = @charisma, luck = @luck, - updated_at = now() at time zone 'utc' - FROM usr WHERE usr.id = user_id; - """ - |> Sql.executeNonQueryAsync - |> Async.AwaitTask - let tryFindPlayer (discordId : uint64) = async { try let! user = @@ -308,23 +290,6 @@ let updatePlayerCurrency (addAmount : int) (did : uint64) = |> Sql.executeNonQueryAsync |> Async.AwaitTask -let updatePlayer (player : PlayerData) = - connStr - |> Sql.connect - |> Sql.parameters [ - "did", Sql.string (string player.DiscordId) - "gbt", Sql.int (int player.Bank) - "strength", Sql.int player.Stats.Strength.Amount - "focus", Sql.int player.Stats.Focus.Amount - "charisma", Sql.int player.Stats.Charisma.Amount - "luck", Sql.int player.Stats.Luck.Amount - ] |> Sql.query """ - UPDATE "user" SET gbt = @gbt, strength = @strength, focus = @focus, charisma = @charisma, luck = @luck - WHERE discord_id = @did - """ - |> Sql.executeNonQueryAsync - |> Async.AwaitTask - let addAchievement (did : uint64) (achievement : string) = connStr |> Sql.connect diff --git a/Bot/Games/HackerBattle.fs b/Bot/Games/HackerBattle.fs index 1e35a78..7797192 100644 --- a/Bot/Games/HackerBattle.fs +++ b/Bot/Games/HackerBattle.fs @@ -96,8 +96,8 @@ let updateCombatants successfulHack (attacker : PlayerData) (defender : PlayerDa Timestamp = DateTime.UtcNow Cooldown = if isDefenderEvent then int WeaponClass.SameTargetAttackCooldown.TotalMinutes * 1 else hack.Cooldown } - [ DbService.updatePlayer <| updatePlayer prize (event false) attacker - DbService.updatePlayer <| updatePlayer -prize (event true) defender + [ DbService.updatePlayerCurrency prize attacker.DiscordId + DbService.updatePlayerCurrency -prize defender.DiscordId DbService.addPlayerEvent attacker.DiscordId (event false) DbService.addPlayerEvent defender.DiscordId (event true) ] |> Async.Parallel @@ -212,7 +212,6 @@ let handleDefense (ctx : IDiscordContext) = Cooldown = shieldItem.Cooldown Timestamp = DateTime.UtcNow } - do! DbService.updatePlayer p |> Async.Ignore do! DbService.addPlayerEvent p.DiscordId defense |> Async.Ignore let builder = DiscordMessageBuilder() builder.WithContent($"{ctx.GetDiscordMember().Username} has protected their system!") |> ignore @@ -271,7 +270,6 @@ let arsenal (ctx : IDiscordContext) = builder.AddEmbed(embed) |> ignore builder.IsEphemeral <- true do! ctx.FollowUp(builder) |> Async.AwaitTask - do! DbService.updatePlayer updatedPlayer |> Async.Ignore do! Analytics.arsenalCommand (ctx.GetDiscordMember()) }) diff --git a/Bot/Games/Thief.fs b/Bot/Games/Thief.fs index 5e57a8a..d5bfc47 100644 --- a/Bot/Games/Thief.fs +++ b/Bot/Games/Thief.fs @@ -182,7 +182,7 @@ let handleSteal (ctx : IDiscordContext) = Timestamp = DateTime.UtcNow Cooldown = VictimRecovery.Minutes * 1 } - do! DbService.updatePlayer { t with Bank = max (t.Bank - prize) 0 } |> Async.Ignore + do! DbService.updatePlayerCurrency -prize t.DiscordId |> Async.Ignore do! DbService.addPlayerEvent victim.DiscordId mugged |> Async.Ignore | None -> () @@ -191,7 +191,7 @@ let handleSteal (ctx : IDiscordContext) = Cooldown = ThiefCooldown.Minutes * 1 Timestamp = DateTime.UtcNow } - do! DbService.updatePlayer { thief with Bank = thief.Bank + prize } |> Async.Ignore + do! DbService.updatePlayerCurrency prize thief.DiscordId |> Async.Ignore do! DbService.addPlayerEvent victim.DiscordId stole |> Async.Ignore let builder = DiscordMessageBuilder() builder.WithContent($"{thief.Name} stole {prize} from <@{victim.DiscordId}>!") |> ignore From f555b2f95ada9cdf6ee5e4f71c6daa81c0647c62 Mon Sep 17 00:00:00 2001 From: Joseph Ferano Date: Wed, 1 Jun 2022 10:04:14 +0700 Subject: [PATCH 2/4] Strength bonus --- Bot/Bot.fs | 6 +++--- Bot/Games/HackerBattle.fs | 12 +++++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Bot/Bot.fs b/Bot/Bot.fs index e756c8a..a2c5c87 100644 --- a/Bot/Bot.fs +++ b/Bot/Bot.fs @@ -102,6 +102,9 @@ let asdf _ (event : DSharpPlus.EventArgs.InteractionCreateEventArgs) = :> Task //hackerBattleBot.add_InteractionCreated(AsyncEventHandler(asdf)) +hackerBattleBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously +GuildEnvironment.botClientHacker <- Some hackerBattleBot + adminBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously inviterBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously @@ -113,9 +116,6 @@ GuildEnvironment.botClientStore <- Some storeBot jpegBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously GuildEnvironment.botClientJpeg <- Some jpegBot -hackerBattleBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously -GuildEnvironment.botClientHacker <- Some hackerBattleBot - slotsBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously GuildEnvironment.botClientSlots <- Some slotsBot diff --git a/Bot/Games/HackerBattle.fs b/Bot/Games/HackerBattle.fs index 7797192..eb19b6b 100644 --- a/Bot/Games/HackerBattle.fs +++ b/Bot/Games/HackerBattle.fs @@ -83,8 +83,6 @@ let runHackerBattle defender (hack : HackItem) = | _ -> false) let updateCombatants successfulHack (attacker : PlayerData) (defender : PlayerData) (hack : HackItem) prize = - let updatePlayer amount attack p = - { p with Events = attack::p.Events ; Bank = max (p.Bank + amount) 0 } let event isDefenderEvent = let hackEvent = { HackId = hack.Id @@ -104,8 +102,16 @@ let updateCombatants successfulHack (attacker : PlayerData) (defender : PlayerDa |> Async.Ignore let successfulHack (ctx : IDiscordContext) attacker defender (hack : HackItem) = + let strengthBonus attacker defender = + attacker - defender + |> max 0 + |> float + |> (*) 0.01 + |> (*) 200.0 // Bonus + |> int async { - let prizeAmount = if hack.Power < int defender.Bank then hack.Power else int defender.Bank + let bonus = strengthBonus attacker.Stats.Strength.Amount defender.Stats.Strength.Amount + let prizeAmount = if hack.Power + bonus < int defender.Bank then hack.Power + bonus else int defender.Bank do! updateCombatants true attacker defender hack (prizeAmount * 1) let embed = Embeds.responseSuccessfulHack true defender.DiscordId prizeAmount hack From 56525f2ac23ce42da2a5dcaa47ad95a971224218 Mon Sep 17 00:00:00 2001 From: Joseph Ferano Date: Wed, 1 Jun 2022 16:50:53 +0700 Subject: [PATCH 3/4] Embeds for bonus --- Bot/Embeds.fs | 20 +++++++++++++++----- Bot/Games/HackerBattle.fs | 27 +++++++++++++++------------ Bot/Games/Trainer.fs | 5 +++-- 3 files changed, 33 insertions(+), 19 deletions(-) diff --git a/Bot/Embeds.fs b/Bot/Embeds.fs index 103b949..0fc5700 100644 --- a/Bot/Embeds.fs +++ b/Bot/Embeds.fs @@ -49,7 +49,7 @@ let pickDefense actionId player isTrainer = .AddEmbeds([ DiscordEmbedBuilder().WithImageUrl(shieldGif).Build() ; embed.Build() ]) .AsEphemeral(true) -let pickHack actionId attacker defender isTrainer = +let pickHack actionId attacker defender bonus isTrainer = let hackItems = attacker.Inventory |> Inventory.getItemsByType ItemType.Hack @@ -57,10 +57,11 @@ let pickHack actionId attacker defender isTrainer = let buttons = constructButtons actionId $"{defender.DiscordId}-{defender.Name}" attacker hackItems isTrainer let stealMsg = if not isTrainer then $"{defender.Name} has **{defender.Bank} $GBT** we can take from them. " else "" + let strengthMsg = $"You have `{attacker.Stats.Strength.Amount}` strength, while they have `{defender.Stats.Strength.Amount}`\n**Bonus:** `{bonus} 💰$GBT`" let embed = DiscordEmbedBuilder() .WithTitle("Hack Attack") - .WithDescription($"{stealMsg}Pick the hack you want to use.") + .WithDescription($"{stealMsg}\n\n{strengthMsg}\n\nPick the hack you want to use.") if not isTrainer then for hack in Inventory.getHacks attacker.Inventory do @@ -72,14 +73,23 @@ let pickHack actionId attacker defender isTrainer = .AddEmbeds([ DiscordEmbedBuilder().WithImageUrl(hackGif).Build() ; embed.Build() ]) .AsEphemeral true -let responseSuccessfulHack earnedMoney (targetId : uint64) amountTaken (hack : HackItem) = +let responseSuccessfulHack (hacker : PlayerData) (target : PlayerData) totalTaken bonus (hack : HackItem) = + let earnedMoney = totalTaken > 0 let embed = DiscordEmbedBuilder() .WithImageUrl(hack.ImageUrl) .WithTitle("Hack Attack") - .WithDescription($"You successfully hacked <@{targetId}> using {hack.Name}" - + (if earnedMoney then $", and took {amountTaken} 💰$GBT from them!" else "!")) + .WithDescription($"You successfully hacked <@{target.DiscordId}> using {hack.Name}" + + (if earnedMoney then $", and took {totalTaken} 💰$GBT from them!" else "!")) + embed.AddField("Prize", $"`{totalTaken} 💰$GBT`", true) |> ignore + let bonusMsg = + if bonus > 0 + then $"{hacker.Stats.Strength.Amount} **VS** {target.Stats.Strength.Amount} -> `+{bonus} $GBT`" + else "None" + embed.AddField("Strength Bonus", bonusMsg, true) |> ignore + + embed.AddField("New $GBT Balance", $"`💰` {hacker.Bank} ⋙ `💰` {hacker.Bank + totalTaken} `(+{totalTaken} $GBT)`") |> ignore DiscordFollowupMessageBuilder() .AddEmbed(embed.Build()) .AsEphemeral(true) diff --git a/Bot/Games/HackerBattle.fs b/Bot/Games/HackerBattle.fs index eb19b6b..c693712 100644 --- a/Bot/Games/HackerBattle.fs +++ b/Bot/Games/HackerBattle.fs @@ -69,6 +69,14 @@ let checkTargetHasFunds target player = | true -> Error $"Looks like the poor bastard has no $GBT... pick a different victim." | false -> Ok player +let strengthBonus attacker defender = + attacker - defender + |> max 0 + |> float + |> (*) 0.01 + |> (*) 200.0 // Bonus + |> int + let runHackerBattle defender (hack : HackItem) = defender |> Player.removeExpiredActions @@ -102,19 +110,13 @@ let updateCombatants successfulHack (attacker : PlayerData) (defender : PlayerDa |> Async.Ignore let successfulHack (ctx : IDiscordContext) attacker defender (hack : HackItem) = - let strengthBonus attacker defender = - attacker - defender - |> max 0 - |> float - |> (*) 0.01 - |> (*) 200.0 // Bonus - |> int async { - let bonus = strengthBonus attacker.Stats.Strength.Amount defender.Stats.Strength.Amount - let prizeAmount = if hack.Power + bonus < int defender.Bank then hack.Power + bonus else int defender.Bank - do! updateCombatants true attacker defender hack (prizeAmount * 1) + let bonus = strengthBonus attacker.Stats.Strength.Amount defender.Stats.Strength.Amount |> (*) 1 + let basePrize = hack.Power * 1 + let prizeAmount = if basePrize + bonus < defender.Bank then basePrize + bonus else defender.Bank + do! updateCombatants true attacker defender hack prizeAmount - let embed = Embeds.responseSuccessfulHack true defender.DiscordId prizeAmount hack + let embed = Embeds.responseSuccessfulHack attacker defender prizeAmount bonus hack do! ctx.FollowUp embed |> Async.AwaitTask let builder = Embeds.eventSuccessfulHack ctx defender prizeAmount @@ -150,7 +152,8 @@ let hack (target : DiscordUser) (ctx : IDiscordContext) = >>= checkPlayerIsAttackingThemselves defender |> function | Ok atkr -> async { - let embed = Embeds.pickHack "Attack" atkr defender false + let bonus = strengthBonus attacker.Stats.Strength.Amount defender.Stats.Strength.Amount + let embed = Embeds.pickHack "Attack" atkr defender bonus false do! ctx.FollowUp(embed) |> Async.AwaitTask // TODO: Add a call when it's an error with the error type, must include an error code do! Analytics.hackCommand (ctx.GetDiscordMember()) diff --git a/Bot/Games/Trainer.fs b/Bot/Games/Trainer.fs index ccffa7b..bf3694f 100644 --- a/Bot/Games/Trainer.fs +++ b/Bot/Games/Trainer.fs @@ -126,7 +126,7 @@ let hack (target : DiscordUser) (ctx : IDiscordContext) = | true -> let player = { PlayerData.empty with Inventory = [ hackItem ] } let bot = { PlayerData.empty with DiscordId = Sensei.Id ; Name = Sensei.Name } - let embed = Embeds.pickHack "Trainer-4" player bot true + let embed = Embeds.pickHack "Trainer-4" player bot 0 true do! ctx.FollowUp(embed) |> Async.AwaitTask | false -> @@ -143,7 +143,8 @@ let handleHack (ctx : IDiscordContext) = PlayerInteractions.executePlayerAction ctx (fun player -> async { let sendMessage' = sendFollowUpMessage ctx do! Async.Sleep 1000 - let embed = Embeds.responseSuccessfulHack false Sensei.Id defaultHack.Power defaultHack + let bot = { PlayerData.empty with DiscordId = Sensei.Id ; Name = Sensei.Name } + let embed = Embeds.responseSuccessfulHack player bot (defaultHack.Power * 1) 0 defaultHack do! ctx.FollowUp(embed) |> Async.AwaitTask do! Async.Sleep 1000 do! sendMessage' From 929195393a990d64ceb9cff1c94ab842a3c7b73d Mon Sep 17 00:00:00 2001 From: Joseph Ferano Date: Thu, 2 Jun 2022 21:18:06 +0700 Subject: [PATCH 4/4] Copy for strength hacking --- Bot/Embeds.fs | 44 ++++++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/Bot/Embeds.fs b/Bot/Embeds.fs index 0fc5700..7e8011b 100644 --- a/Bot/Embeds.fs +++ b/Bot/Embeds.fs @@ -55,13 +55,28 @@ let pickHack actionId attacker defender bonus isTrainer = |> Inventory.getItemsByType ItemType.Hack |> List.sortBy (fun item -> item.Id) let buttons = constructButtons actionId $"{defender.DiscordId}-{defender.Name}" attacker hackItems isTrainer + + let ( outcomeMsg , bonusMsg ) = + if attacker.Stats.Strength.Amount > defender.Stats.Strength.Amount then + "\nYou're stronger so you'll steal more!!!\n" , $"\n**__Potential Bonus:__**\n{bonus} 💰$GBT" + else + "\nYou're not stronger than them, you need to eat more!" , "" + let stealMsg = + if not isTrainer + then $""" + {defender.Name} has **{defender.Bank} $GBT** we can take from them. - let stealMsg = if not isTrainer then $"{defender.Name} has **{defender.Bank} $GBT** we can take from them. " else "" - let strengthMsg = $"You have `{attacker.Stats.Strength.Amount}` strength, while they have `{defender.Stats.Strength.Amount}`\n**Bonus:** `{bonus} 💰$GBT`" + **__Your Strength:__** + 💪 {attacker.Stats.Strength.Amount} + + **__Their Strength:__** + 💪 {defender.Stats.Strength.Amount} + {outcomeMsg}{bonusMsg}""" + else "" let embed = DiscordEmbedBuilder() .WithTitle("Hack Attack") - .WithDescription($"{stealMsg}\n\n{strengthMsg}\n\nPick the hack you want to use.") + .WithDescription($"{stealMsg}\n\nPick the hack you want to use.") if not isTrainer then for hack in Inventory.getHacks attacker.Inventory do @@ -75,20 +90,21 @@ let pickHack actionId attacker defender bonus isTrainer = let responseSuccessfulHack (hacker : PlayerData) (target : PlayerData) totalTaken bonus (hack : HackItem) = let earnedMoney = totalTaken > 0 + + let msg = $"You successfully hacked <@{target.DiscordId}> using {hack.Name}!\n\n" + + (if earnedMoney then $"**__Total Stolen__**: {totalTaken} 💰$GBT\n" else "") + + let bonusMsg = + if bonus > 0 + then $"Because your strength is `💪 {hacker.Stats.Strength.Amount}` and your target's strength is `💪 {target.Stats.Strength.Amount}` You stole an extra `{bonus}` 💰$GBT" + else "" + let embed = DiscordEmbedBuilder() .WithImageUrl(hack.ImageUrl) - .WithTitle("Hack Attack") - .WithDescription($"You successfully hacked <@{target.DiscordId}> using {hack.Name}" - + (if earnedMoney then $", and took {totalTaken} 💰$GBT from them!" else "!")) - - embed.AddField("Prize", $"`{totalTaken} 💰$GBT`", true) |> ignore - let bonusMsg = - if bonus > 0 - then $"{hacker.Stats.Strength.Amount} **VS** {target.Stats.Strength.Amount} -> `+{bonus} $GBT`" - else "None" - embed.AddField("Strength Bonus", bonusMsg, true) |> ignore - + .WithTitle("✅ Hack Successful!") + .WithDescription($"{msg}\n{bonusMsg}") + embed.AddField("New $GBT Balance", $"`💰` {hacker.Bank} ⋙ `💰` {hacker.Bank + totalTaken} `(+{totalTaken} $GBT)`") |> ignore DiscordFollowupMessageBuilder() .AddEmbed(embed.Build())