Non ephemeral hacking

This commit is contained in:
Joseph Ferano 2022-06-18 00:24:38 +07:00
parent 9d1ea037b2
commit e08e35f909
4 changed files with 82 additions and 39 deletions

View File

@ -110,13 +110,11 @@ let pickHack actionId attacker defender bonus isTrainer =
let responseSuccessfulHack (hacker : PlayerData) (target : PlayerData) totalTaken bonus (hack : HackItem) = let responseSuccessfulHack (hacker : PlayerData) (target : PlayerData) totalTaken bonus (hack : HackItem) =
let earnedMoney = totalTaken > 0<GBT> let earnedMoney = totalTaken > 0<GBT>
let msg = $"You successfully hacked <@{target.DiscordId}> using {hack.Name}!\n\n" let msg = $"{hacker.Name} successfully hacked <@{target.DiscordId}>\n\n"
+ (if earnedMoney then $"**__Total Stolen__**: {totalTaken} 💰$GBT\n" else "") + (if earnedMoney then $"**__Total Stolen__**: {totalTaken} 💰$GBT\n" else "")
let bonusMsg = let bonusMsg =
if bonus > 0<GBT> $"Because your strength is `💪 {hacker.Stats.Strength.Amount}` and your target's strength is `💪 {target.Stats.Strength.Amount}` You stole an extra `{bonus}` 💰$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()
@ -129,6 +127,48 @@ let responseSuccessfulHack (hacker : PlayerData) (target : PlayerData) totalTake
.AddEmbed(embed.Build()) .AddEmbed(embed.Build())
.AsEphemeral(true) .AsEphemeral(true)
let responseSuccessfulHack2 successful (hacker : PlayerData) (target : PlayerData) (hackerMember : DiscordMember) (targetMember : DiscordMember) totalTaken bonus (hack : HackItem) =
let earnedMoney = totalTaken > 0<GBT>
let msg = $"{hacker.Name} 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 **{hacker.Name}** strength is `💪 {hacker.Stats.Strength.Amount}` and **{target.Name}** strength is `💪 {target.Stats.Strength.Amount}`, they got a `{bonus}` 💰$GBT bonus"
else ""
let embed1 =
DiscordEmbedBuilder()
.WithThumbnail(hackGif)
.WithColor(DiscordColor.Blurple)
.WithTitle("✅ Hack Successful!")
.WithDescription($"{msg}\n{bonusMsg}")
let h = ( hacker.Name , hackerMember.AvatarUrl )
let t = ( target.Name , targetMember.AvatarUrl )
let winner = if successful then h else t
let loser = if successful then t else h
let winnerEmbed =
DiscordEmbedBuilder()
.WithAuthor(name = fst winner , iconUrl = snd winner)
.WithColor(DiscordColor.Green)
let loserEmbed =
DiscordEmbedBuilder()
.WithAuthor(name = fst loser , iconUrl = snd loser)
.WithColor(DiscordColor.Red)
winnerEmbed.AddField("Strength", $"{hacker.Stats.Strength.Amount}", true) |> ignore
winnerEmbed.AddField("New $GBT Balance", $"`💰` {hacker.Bank} `💰` {hacker.Bank + totalTaken} `(+{totalTaken} $GBT)`", true) |> ignore
loserEmbed.AddField("Strength", $"{target.Stats.Strength.Amount}", true) |> ignore
loserEmbed.AddField("New $GBT Balance", $"`💰` {target.Bank} `💰` {target.Bank - totalTaken} `(-{totalTaken} $GBT)`", true) |> ignore
let embeds =
if successful
then [ embed1 ; winnerEmbed ; loserEmbed ] |> List.map (fun e -> e.Build())
else [ embed1 ; loserEmbed ; winnerEmbed ] |> List.map (fun e -> e.Build())
DiscordMessageBuilder().AddEmbeds(embeds)
let responseCreatedShield (shield : ShieldItem) = let responseCreatedShield (shield : ShieldItem) =
let embed = DiscordEmbedBuilder().WithImageUrl(shield.ImageUrl) let embed = DiscordEmbedBuilder().WithImageUrl(shield.ImageUrl)
embed.Title <- "Mounted Shield" embed.Title <- "Mounted Shield"
@ -138,11 +178,6 @@ let responseCreatedShield (shield : ShieldItem) =
.AddEmbed(embed) .AddEmbed(embed)
.AsEphemeral(true) .AsEphemeral(true)
let eventSuccessfulHack (ctx : IDiscordContext) target prize =
DiscordMessageBuilder()
.WithAllowedMention(UserMention(target.DiscordId))
.WithContent($"**{ctx.GetDiscordMember().Username}** successfully hacked **{target.Name}** and took {prize} $GBT! - <@!{target.DiscordId}>")
let getArsenalEmbed (player : PlayerData) = let getArsenalEmbed (player : PlayerData) =
DiscordFollowupMessageBuilder() DiscordFollowupMessageBuilder()
.AsEphemeral(true) .AsEphemeral(true)

View File

@ -9,6 +9,8 @@ type mins
[<Measure>] [<Measure>]
type GBT type GBT
let gbt x = x * 1<GBT>
type Range = { Min : int ; Max : int } type Range = { Min : int ; Max : int }
module Range = module Range =

View File

@ -109,34 +109,33 @@ let updateCombatants successfulHack (attacker : PlayerData) (defender : PlayerDa
|> Async.Parallel |> Async.Parallel
|> Async.Ignore |> Async.Ignore
let successfulHack (ctx : IDiscordContext) attacker defender (hack : HackItem) = let hackerResult successfulHack (ctx : IDiscordContext) attacker defender (hack : HackItem) =
async { async {
let bonus = strengthBonus attacker.Stats.Strength.Amount defender.Stats.Strength.Amount |> (*) 1<GBT> let prizeAmount , bonus =
let basePrize = hack.Power * 1<GBT> if successfulHack then
let prizeAmount = if basePrize + bonus < defender.Bank then basePrize + bonus else defender.Bank let bonus = strengthBonus attacker.Stats.Strength.Amount defender.Stats.Strength.Amount |> gbt
do! updateCombatants true attacker defender hack prizeAmount let basePrize = gbt hack.Power
(if basePrize + bonus < defender.Bank then basePrize + bonus else defender.Bank) , bonus
else
if hack.Power < int attacker.Bank
then gbt hack.Power , 0<GBT>
else attacker.Bank , 0<GBT>
let embed = Embeds.responseSuccessfulHack attacker defender prizeAmount bonus hack let! defenderMember = ctx.GetGuild().GetMemberAsync(defender.DiscordId) |> Async.AwaitTask
do! ctx.FollowUp embed |> Async.AwaitTask // let failedMsg = $"Hack failed! {defender.Name} was able to mount a successful defense! You lost {lostAmount} 💰$GBT!"
let embed = Embeds.responseSuccessfulHack2 successfulHack attacker defender (ctx.GetDiscordMember()) defenderMember prizeAmount bonus hack
let builder = Embeds.eventSuccessfulHack ctx defender prizeAmount do! ctx.GetChannel().SendMessageAsync(embed)
let channel = ctx.GetGuild().GetChannel(GuildEnvironment.channelEventsHackerBattle)
do! channel.SendMessageAsync(builder)
|> Async.AwaitTask |> Async.AwaitTask
|> Async.Ignore |> Async.Ignore
}
let failedHack (ctx : IDiscordContext) attacker defender (hack : HackItem) = do! updateCombatants successfulHack attacker defender hack prizeAmount
async {
let lostAmount = if hack.Power < int attacker.Bank then hack.Power else int attacker.Bank
let msg = $"Hack failed! {defender.Name} was able to mount a successful defense! You lost {lostAmount} 💰$GBT!"
do! sendFollowUpMessage ctx msg
do! updateCombatants false attacker defender hack (-lostAmount * 1<GBT>) let builder = DiscordMessageBuilder().WithAllowedMention(UserMention(defender.DiscordId))
if successfulHack then
let builder = DiscordMessageBuilder() builder.Content <- $"**{ctx.GetDiscordMember().Username}** successfully hacked **{defender.Name}** and took {prizeAmount} $GBT! - <@!{defender.DiscordId}>"
builder.WithContent($"Hacking attempt failed! **{defender.Name}** defended hack from **{ctx.GetDiscordMember().Username}** and took {lostAmount} 💰$GBT from them! <@!{defender.DiscordId}>") |> ignore else
let channel = (ctx.GetGuild().GetChannel(GuildEnvironment.channelEventsHackerBattle)) builder.Content <- $"Hacking attempt failed! **{defender.Name}** defended hack from **{ctx.GetDiscordMember().Username}** and took {prizeAmount} 💰$GBT from them! <@!{defender.DiscordId}>"
let channel = ctx.GetGuild().GetChannel(GuildEnvironment.channelEventsHackerBattle)
do! channel.SendMessageAsync(builder) do! channel.SendMessageAsync(builder)
|> Async.AwaitTask |> Async.AwaitTask
|> Async.Ignore |> Async.Ignore
@ -162,7 +161,7 @@ let hack (target : DiscordUser) (ctx : IDiscordContext) =
}) })
let handleAttack (ctx : IDiscordContext) = let handleAttack (ctx : IDiscordContext) =
executePlayerAction ctx (fun attacker -> async { executePlayerActionNoMsg ctx (fun attacker -> async {
let tokens = ctx.GetInteractionId().Split("-") let tokens = ctx.GetInteractionId().Split("-")
let hackId = tokens.[1] let hackId = tokens.[1]
let item = Arsenal.weapons |> Inventory.findItemById hackId let item = Arsenal.weapons |> Inventory.findItemById hackId
@ -181,9 +180,7 @@ let handleAttack (ctx : IDiscordContext) =
|> function |> function
| Ok attacker -> async { | Ok attacker -> async {
let result = runHackerBattle defender hackItem let result = runHackerBattle defender hackItem
match result with do! hackerResult (not result) ctx attacker defender hackItem
| false -> do! successfulHack ctx attacker defender hackItem
| true -> do! failedHack ctx attacker defender hackItem
do! Analytics.hackedTarget (ctx.GetDiscordMember()) hackItem.Name (not result) do! Analytics.hackedTarget (ctx.GetDiscordMember()) hackItem.Name (not result)
} }
| Error msg -> Messaging.sendFollowUpMessage ctx msg | Error msg -> Messaging.sendFollowUpMessage ctx msg
@ -334,7 +331,6 @@ let handleMemberUpdated _ (event : GuildMemberUpdateEventArgs) =
return () return ()
} :> Task } :> Task
type HackerGame() = type HackerGame() =
inherit ApplicationCommandModule () inherit ApplicationCommandModule ()

View File

@ -9,7 +9,17 @@ open Degenz.DbService
let executePlayerAction (ctx : IDiscordContext) (dispatch : PlayerData -> Async<unit>) = let executePlayerAction (ctx : IDiscordContext) (dispatch : PlayerData -> Async<unit>) =
async { async {
let builder = DiscordInteractionResponseBuilder().AsEphemeral(true) let builder = DiscordInteractionResponseBuilder().AsEphemeral(true)
do! ctx.Respond(InteractionResponseType.DeferredChannelMessageWithSource, builder) |> Async.AwaitTask do! ctx.Respond(InteractionResponseType.DeferredMessageUpdate, builder) |> Async.AwaitTask
let! playerResult = tryFindPlayer (ctx.GetDiscordMember().Id)
match playerResult with
| Some player -> do! dispatch player
| None -> do! Messaging.sendFollowUpMessage ctx "You are currently not a hacker, first use the /redpill command to become one"
} |> Async.StartAsTask :> Task
let executePlayerActionNoMsg (ctx : IDiscordContext) (dispatch : PlayerData -> Async<unit>) =
async {
let builder = DiscordInteractionResponseBuilder().AsEphemeral(true)
do! ctx.Respond(InteractionResponseType.DeferredMessageUpdate, builder) |> Async.AwaitTask
let! playerResult = tryFindPlayer (ctx.GetDiscordMember().Id) let! playerResult = tryFindPlayer (ctx.GetDiscordMember().Id)
match playerResult with match playerResult with
| Some player -> do! dispatch player | Some player -> do! dispatch player