Merge branch 'dev'
This commit is contained in:
commit
1e47073721
@ -102,6 +102,9 @@ let asdf _ (event : DSharpPlus.EventArgs.InteractionCreateEventArgs) =
|
|||||||
:> Task
|
:> Task
|
||||||
//hackerBattleBot.add_InteractionCreated(AsyncEventHandler(asdf))
|
//hackerBattleBot.add_InteractionCreated(AsyncEventHandler(asdf))
|
||||||
|
|
||||||
|
hackerBattleBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously
|
||||||
|
GuildEnvironment.botClientHacker <- Some hackerBattleBot
|
||||||
|
|
||||||
adminBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously
|
adminBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously
|
||||||
|
|
||||||
inviterBot.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
|
jpegBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously
|
||||||
GuildEnvironment.botClientJpeg <- Some jpegBot
|
GuildEnvironment.botClientJpeg <- Some jpegBot
|
||||||
|
|
||||||
hackerBattleBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously
|
|
||||||
GuildEnvironment.botClientHacker <- Some hackerBattleBot
|
|
||||||
|
|
||||||
slotsBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously
|
slotsBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously
|
||||||
GuildEnvironment.botClientSlots <- Some slotsBot
|
GuildEnvironment.botClientSlots <- Some slotsBot
|
||||||
|
|
||||||
|
@ -235,24 +235,6 @@ let getPlayerEvents (did : uint64) =
|
|||||||
)
|
)
|
||||||
|> Async.AwaitTask
|
|> 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 {
|
let tryFindPlayer (discordId : uint64) = async {
|
||||||
try
|
try
|
||||||
let! user =
|
let! user =
|
||||||
@ -308,23 +290,6 @@ let updatePlayerCurrency (addAmount : int<GBT>) (did : uint64) =
|
|||||||
|> Sql.executeNonQueryAsync
|
|> Sql.executeNonQueryAsync
|
||||||
|> Async.AwaitTask
|
|> 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) =
|
let addAchievement (did : uint64) (achievement : string) =
|
||||||
connStr
|
connStr
|
||||||
|> Sql.connect
|
|> Sql.connect
|
||||||
|
@ -49,18 +49,34 @@ let pickDefense actionId player isTrainer =
|
|||||||
.AddEmbeds([ DiscordEmbedBuilder().WithImageUrl(shieldGif).Build() ; embed.Build() ])
|
.AddEmbeds([ DiscordEmbedBuilder().WithImageUrl(shieldGif).Build() ; embed.Build() ])
|
||||||
.AsEphemeral(true)
|
.AsEphemeral(true)
|
||||||
|
|
||||||
let pickHack actionId attacker defender isTrainer =
|
let pickHack actionId attacker defender bonus isTrainer =
|
||||||
let hackItems =
|
let hackItems =
|
||||||
attacker.Inventory
|
attacker.Inventory
|
||||||
|> Inventory.getItemsByType ItemType.Hack
|
|> Inventory.getItemsByType ItemType.Hack
|
||||||
|> List.sortBy (fun item -> item.Id)
|
|> List.sortBy (fun item -> item.Id)
|
||||||
let buttons = constructButtons actionId $"{defender.DiscordId}-{defender.Name}" attacker hackItems isTrainer
|
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 =
|
let embed =
|
||||||
DiscordEmbedBuilder()
|
DiscordEmbedBuilder()
|
||||||
.WithTitle("Hack Attack")
|
.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
|
if not isTrainer then
|
||||||
for hack in Inventory.getHacks attacker.Inventory do
|
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() ])
|
.AddEmbeds([ DiscordEmbedBuilder().WithImageUrl(hackGif).Build() ; embed.Build() ])
|
||||||
.AsEphemeral true
|
.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 =
|
let embed =
|
||||||
DiscordEmbedBuilder()
|
DiscordEmbedBuilder()
|
||||||
.WithImageUrl(hack.ImageUrl)
|
.WithImageUrl(hack.ImageUrl)
|
||||||
.WithTitle("Hack Attack")
|
.WithTitle("✅ Hack Successful!")
|
||||||
.WithDescription($"You successfully hacked <@{targetId}> using {hack.Name}"
|
.WithDescription($"{msg}\n{bonusMsg}")
|
||||||
+ (if earnedMoney then $", and took {amountTaken} 💰$GBT from them!" else "!"))
|
|
||||||
|
embed.AddField("New $GBT Balance", $"`💰` {hacker.Bank} ⋙ `💰` {hacker.Bank + totalTaken} `(+{totalTaken} $GBT)`") |> ignore
|
||||||
DiscordFollowupMessageBuilder()
|
DiscordFollowupMessageBuilder()
|
||||||
.AddEmbed(embed.Build())
|
.AddEmbed(embed.Build())
|
||||||
.AsEphemeral(true)
|
.AsEphemeral(true)
|
||||||
|
@ -69,6 +69,14 @@ let checkTargetHasFunds target player =
|
|||||||
| 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
|
||||||
|
|
||||||
|
let strengthBonus attacker defender =
|
||||||
|
attacker - defender
|
||||||
|
|> max 0
|
||||||
|
|> float
|
||||||
|
|> (*) 0.01
|
||||||
|
|> (*) 200.0 // Bonus
|
||||||
|
|> int
|
||||||
|
|
||||||
let runHackerBattle defender (hack : HackItem) =
|
let runHackerBattle defender (hack : HackItem) =
|
||||||
defender
|
defender
|
||||||
|> Player.removeExpiredActions
|
|> Player.removeExpiredActions
|
||||||
@ -83,8 +91,6 @@ let runHackerBattle defender (hack : HackItem) =
|
|||||||
| _ -> false)
|
| _ -> false)
|
||||||
|
|
||||||
let updateCombatants successfulHack (attacker : PlayerData) (defender : PlayerData) (hack : HackItem) prize =
|
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 event isDefenderEvent =
|
||||||
let hackEvent = {
|
let hackEvent = {
|
||||||
HackId = hack.Id
|
HackId = hack.Id
|
||||||
@ -96,8 +102,8 @@ let updateCombatants successfulHack (attacker : PlayerData) (defender : PlayerDa
|
|||||||
Timestamp = DateTime.UtcNow
|
Timestamp = DateTime.UtcNow
|
||||||
Cooldown = if isDefenderEvent then int WeaponClass.SameTargetAttackCooldown.TotalMinutes * 1<mins> else hack.Cooldown }
|
Cooldown = if isDefenderEvent then int WeaponClass.SameTargetAttackCooldown.TotalMinutes * 1<mins> else hack.Cooldown }
|
||||||
|
|
||||||
[ DbService.updatePlayer <| updatePlayer prize (event false) attacker
|
[ DbService.updatePlayerCurrency prize attacker.DiscordId
|
||||||
DbService.updatePlayer <| updatePlayer -prize (event true) defender
|
DbService.updatePlayerCurrency -prize defender.DiscordId
|
||||||
DbService.addPlayerEvent attacker.DiscordId (event false)
|
DbService.addPlayerEvent attacker.DiscordId (event false)
|
||||||
DbService.addPlayerEvent defender.DiscordId (event true) ]
|
DbService.addPlayerEvent defender.DiscordId (event true) ]
|
||||||
|> Async.Parallel
|
|> Async.Parallel
|
||||||
@ -105,10 +111,12 @@ let updateCombatants successfulHack (attacker : PlayerData) (defender : PlayerDa
|
|||||||
|
|
||||||
let successfulHack (ctx : IDiscordContext) attacker defender (hack : HackItem) =
|
let successfulHack (ctx : IDiscordContext) attacker defender (hack : HackItem) =
|
||||||
async {
|
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 |> (*) 1<GBT>
|
||||||
do! updateCombatants true attacker defender hack (prizeAmount * 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
|
do! ctx.FollowUp embed |> Async.AwaitTask
|
||||||
|
|
||||||
let builder = Embeds.eventSuccessfulHack ctx defender prizeAmount
|
let builder = Embeds.eventSuccessfulHack ctx defender prizeAmount
|
||||||
@ -144,7 +152,8 @@ let hack (target : DiscordUser) (ctx : IDiscordContext) =
|
|||||||
>>= checkPlayerIsAttackingThemselves defender
|
>>= checkPlayerIsAttackingThemselves defender
|
||||||
|> function
|
|> function
|
||||||
| Ok atkr -> async {
|
| 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
|
do! ctx.FollowUp(embed) |> Async.AwaitTask
|
||||||
// TODO: Add a call when it's an error with the error type, must include an error code
|
// TODO: Add a call when it's an error with the error type, must include an error code
|
||||||
do! Analytics.hackCommand (ctx.GetDiscordMember())
|
do! Analytics.hackCommand (ctx.GetDiscordMember())
|
||||||
@ -212,7 +221,6 @@ let handleDefense (ctx : IDiscordContext) =
|
|||||||
Cooldown = shieldItem.Cooldown
|
Cooldown = shieldItem.Cooldown
|
||||||
Timestamp = DateTime.UtcNow
|
Timestamp = DateTime.UtcNow
|
||||||
}
|
}
|
||||||
do! DbService.updatePlayer p |> Async.Ignore
|
|
||||||
do! DbService.addPlayerEvent p.DiscordId defense |> Async.Ignore
|
do! DbService.addPlayerEvent p.DiscordId defense |> 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
|
||||||
@ -271,7 +279,6 @@ let arsenal (ctx : IDiscordContext) =
|
|||||||
builder.AddEmbed(embed) |> ignore
|
builder.AddEmbed(embed) |> ignore
|
||||||
builder.IsEphemeral <- true
|
builder.IsEphemeral <- true
|
||||||
do! ctx.FollowUp(builder) |> Async.AwaitTask
|
do! ctx.FollowUp(builder) |> Async.AwaitTask
|
||||||
do! DbService.updatePlayer updatedPlayer |> Async.Ignore
|
|
||||||
do! Analytics.arsenalCommand (ctx.GetDiscordMember())
|
do! Analytics.arsenalCommand (ctx.GetDiscordMember())
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -182,7 +182,7 @@ let handleSteal (ctx : IDiscordContext) =
|
|||||||
Timestamp = DateTime.UtcNow
|
Timestamp = DateTime.UtcNow
|
||||||
Cooldown = VictimRecovery.Minutes * 1<mins>
|
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
|
do! DbService.addPlayerEvent victim.DiscordId mugged |> Async.Ignore
|
||||||
| None -> ()
|
| None -> ()
|
||||||
|
|
||||||
@ -191,7 +191,7 @@ let handleSteal (ctx : IDiscordContext) =
|
|||||||
Cooldown = ThiefCooldown.Minutes * 1<mins>
|
Cooldown = ThiefCooldown.Minutes * 1<mins>
|
||||||
Timestamp = DateTime.UtcNow
|
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
|
do! DbService.addPlayerEvent victim.DiscordId stole |> Async.Ignore
|
||||||
let builder = DiscordMessageBuilder()
|
let builder = DiscordMessageBuilder()
|
||||||
builder.WithContent($"{thief.Name} stole {prize} from <@{victim.DiscordId}>!") |> ignore
|
builder.WithContent($"{thief.Name} stole {prize} from <@{victim.DiscordId}>!") |> ignore
|
||||||
|
@ -126,7 +126,7 @@ let hack (target : DiscordUser) (ctx : IDiscordContext) =
|
|||||||
| true ->
|
| true ->
|
||||||
let player = { PlayerData.empty with Inventory = [ hackItem ] }
|
let player = { PlayerData.empty with Inventory = [ hackItem ] }
|
||||||
let bot = { PlayerData.empty with DiscordId = Sensei.Id ; Name = Sensei.Name }
|
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
|
do! ctx.FollowUp(embed) |> Async.AwaitTask
|
||||||
| false ->
|
| false ->
|
||||||
@ -143,7 +143,8 @@ let handleHack (ctx : IDiscordContext) =
|
|||||||
PlayerInteractions.executePlayerAction ctx (fun player -> async {
|
PlayerInteractions.executePlayerAction ctx (fun player -> async {
|
||||||
let sendMessage' = sendFollowUpMessage ctx
|
let sendMessage' = sendFollowUpMessage ctx
|
||||||
do! Async.Sleep 1000
|
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! ctx.FollowUp(embed) |> Async.AwaitTask
|
||||||
do! Async.Sleep 1000
|
do! Async.Sleep 1000
|
||||||
do! sendMessage'
|
do! sendMessage'
|
||||||
|
Loading…
x
Reference in New Issue
Block a user