Merge branch 'dev'
This commit is contained in:
commit
1e47073721
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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 stealMsg = if not isTrainer then $"{defender.Name} has **{defender.Bank} $GBT** we can take from them. " else ""
|
||||
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.
|
||||
|
||||
**__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)
|
||||
|
@ -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())
|
||||
})
|
||||
|
||||
|
@ -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
|
||||
|
@ -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'
|
||||
|
Loading…
x
Reference in New Issue
Block a user