Merge branch 'dev'

This commit is contained in:
Joseph Ferano 2022-06-03 00:28:48 +07:00
commit 1e47073721
6 changed files with 59 additions and 60 deletions

View File

@ -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

View File

@ -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<GBT>) (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

View File

@ -49,18 +49,34 @@ 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
|> 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 ""
**__Your Strength:__**
💪 {attacker.Stats.Strength.Amount}
**__Their Strength:__**
💪 {defender.Stats.Strength.Amount}
{outcomeMsg}{bonusMsg}"""
else ""
let embed =
DiscordEmbedBuilder()
.WithTitle("Hack Attack")
.WithDescription($"{stealMsg}Pick 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
@ -72,14 +88,24 @@ 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<GBT>
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<GBT>
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 <@{targetId}> using {hack.Name}"
+ (if earnedMoney then $", and took {amountTaken} 💰$GBT from them!" else "!"))
.WithTitle("Hack Successful!")
.WithDescription($"{msg}\n{bonusMsg}")
embed.AddField("New $GBT Balance", $"`💰` {hacker.Bank} `💰` {hacker.Bank + totalTaken} `(+{totalTaken} $GBT)`") |> ignore
DiscordFollowupMessageBuilder()
.AddEmbed(embed.Build())
.AsEphemeral(true)

View File

@ -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
@ -83,8 +91,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<GBT> }
let event isDefenderEvent =
let hackEvent = {
HackId = hack.Id
@ -96,8 +102,8 @@ let updateCombatants successfulHack (attacker : PlayerData) (defender : PlayerDa
Timestamp = DateTime.UtcNow
Cooldown = if isDefenderEvent then int WeaponClass.SameTargetAttackCooldown.TotalMinutes * 1<mins> 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
@ -105,10 +111,12 @@ let updateCombatants successfulHack (attacker : PlayerData) (defender : PlayerDa
let successfulHack (ctx : IDiscordContext) attacker defender (hack : HackItem) =
async {
let prizeAmount = if hack.Power < int defender.Bank then hack.Power else int defender.Bank
do! updateCombatants true attacker defender hack (prizeAmount * 1<GBT>)
let bonus = strengthBonus attacker.Stats.Strength.Amount defender.Stats.Strength.Amount |> (*) 1<GBT>
let basePrize = hack.Power * 1<GBT>
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
@ -144,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())
@ -212,7 +221,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 +279,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())
})

View File

@ -182,7 +182,7 @@ let handleSteal (ctx : IDiscordContext) =
Timestamp = DateTime.UtcNow
Cooldown = VictimRecovery.Minutes * 1<mins>
}
do! DbService.updatePlayer { t with Bank = max (t.Bank - prize) 0<GBT> } |> 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<mins>
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

View File

@ -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<GBT>) 0<GBT> defaultHack
do! ctx.FollowUp(embed) |> Async.AwaitTask
do! Async.Sleep 1000
do! sendMessage'