module Degenz.Trainer open System.Threading.Tasks open DSharpPlus open DSharpPlus.Entities open DSharpPlus.EventArgs open DSharpPlus.SlashCommands open Degenz.Types open Degenz.Messaging let defaultHack = Armory.battleItems |> Array.find (fun i -> i.Id = int HackId.Virus) let defaultShield = Armory.battleItems |> Array.find (fun i -> i.Id = int ShieldId.Encryption) let sendInitialEmbed (client : DiscordClient) = async { let! channel = client.GetChannelAsync(GuildEnvironment.channelTraining) |> Async.AwaitTask let builder = DiscordMessageBuilder() let embed = DiscordEmbedBuilder() embed.ImageUrl <- "https://s10.gifyu.com/images/MasterTraining_Degenz.gif" builder.AddEmbed embed |> ignore builder.Content <- "Welcome Degen… To the Hacker Training Program.\n" + "Here you will learn how to defend yourself, and hack other Degenz to steal their 💰$GBT.\n" + "Are you ready?" let button = DiscordButtonComponent(ButtonStyle.Success, $"Trainer-1", $"LFG") :> DiscordComponent builder.AddComponents [| button |] |> ignore do! channel.SendMessageAsync(builder) |> Async.AwaitTask |> Async.Ignore } |> Async.RunSynchronously let handleTrainerStep1 (event : ComponentInteractionCreateEventArgs) = Game.executePlayerEvent event (fun player -> async { let weaponName = Player.shields player |> Array.tryHead |> Option.defaultValue defaultShield |> fun w -> w.Name let shieldMessage = if Player.shields player |> Array.isEmpty then $"You do not have any Shields in your arsenal, take this {defaultShield.Name}, you can use it for now" else $"Looks like you have `{weaponName}` in your arsenal… 👀\n" do! sendInteractionEvent event ("Beautopia© is a dangerous place...\n" + "Quick, put up a DEFENSE 🛡 before another Degen hacks you, and steals your 💰$GBT.\n" + shieldMessage + "To enable it, you need to run the `/shield` slash command.\n\n" + $"Type the `/shield` command now, then select - `{weaponName}`\n") }) let defend (ctx : InteractionContext) = Game.executePlayerInteraction ctx (fun player -> async { let playerWithShields = match player.Arsenal with | [||] -> { player with Arsenal = [| defaultShield |] } | _ -> player let embed = Embeds.pickDefense "Trainer-2" playerWithShields do! ctx.Interaction.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource, embed) |> Async.AwaitTask }) let handleDefenseMsg = { ButtonId = "Trainer-3" ButtonText = "Got it" Message = "🎉 Congratulations 🎉\n\n" + "You successfully defended my hack!\n\n" + "Because I tried hacking you when you had your defense up, you stole money from me...\n" + "Defenses only protect you for a LIMITED TIME, so remember to keep at least 1 defense up at all times, or risk getting hacked!" } let handleDefense (event : ComponentInteractionCreateEventArgs) = Game.executePlayerEvent event (fun player -> async { let sendMessage' = sendFollowUpMessage event do! event.Interaction.CreateResponseAsync(InteractionResponseType.DeferredMessageUpdate) |> Async.AwaitTask let shield = Player.shields player |> Array.tryHead |> Option.defaultValue defaultShield let embed = Embeds.responseCreatedShieldTrainer shield do! event.Interaction.CreateFollowupMessageAsync(embed) |> Async.AwaitTask |> Async.Ignore do! Async.Sleep 2000 do! sendMessage' "Ok, good, let me make sure that worked.\n\nI'll try to **hack** you now" do! Async.Sleep 4000 do! sendMessage' $"❌ HACKING FAILED! ❌\n\n{player.Name} defended the hack from <@{GuildEnvironment.botHackerBattle}>, and stole 💰$GBT {Game.ShieldPrize} from them!" do! Async.Sleep 3000 do! sendFollowUpMessageWithButton event handleDefenseMsg }) let handleTrainerStep3 (event : ComponentInteractionCreateEventArgs) = Game.executePlayerEvent event (fun player -> async { let weaponName = Player.hacks player |> Array.tryHead |> Option.defaultValue defaultShield |> fun w -> w.Name do! updateMessageWithGreyedOutButtons event handleDefenseMsg let hackMessage = if Player.shields player |> Array.isEmpty then $"You do not have any Hacks in your arsenal, take this {defaultHack.Name}, you can use it for now" else $"Looks like you have `{weaponName}` in your arsenal..." do! sendFollowUpMessage event ("Now let’s **HACK!** 💻\n\n" + "I want you to **HACK ME**, and try to steal my 💰$GBT...\n\n" + hackMessage + "To deploy it, you need to run the `/hack` slash command.\n" + $"Type the `/hack` command now, then choose me - <@{GuildEnvironment.botHackerBattle}> as your target, and select - `{weaponName}`") }) let attack (ctx : InteractionContext) (target : DiscordUser) = Game.executePlayerInteraction ctx (fun player -> async { let isRightTarget = target.Id = GuildEnvironment.botHackerBattle match isRightTarget with | true -> let playerWithAttacks = match player.Arsenal with | [||] -> { player with Arsenal = [| defaultHack |] } | _ -> player let embed = Embeds.pickHack "Trainer-4" playerWithAttacks player do! ctx.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource, embed) |> Async.AwaitTask | false -> let builder = DiscordInteractionResponseBuilder() builder.Content <- "You picked the wrong target, you dufus. Try again, this time pick me!" builder.IsEphemeral <- true do! ctx.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource, builder) |> Async.AwaitTask }) let handleAttack (event : ComponentInteractionCreateEventArgs) = Game.executePlayerEvent event (fun player -> async { let sendMessage' = sendFollowUpMessage event do! event.Interaction.CreateResponseAsync(InteractionResponseType.DeferredMessageUpdate) |> Async.AwaitTask do! Async.Sleep 1000 let hack = Player.hacks player |> Array.tryHead |> Option.defaultValue defaultHack let embed = Embeds.responseSuccessfulHackTrainer hack do! event.Interaction.CreateFollowupMessageAsync(embed) |> Async.AwaitTask |> Async.Ignore do! Async.Sleep 3000 do! sendMessage' ("🎉 **Congratulations** 🎉\n\n" + "You successfully **HACKED** me, and are now an **Elite Haxor!**\n\n" + "When you **HACK** other Degenz, you **STEAL** their 💰**$GBT.**\n" + "But remember, hacks take time to recover, so use them wisely.") do! Async.Sleep 7000 do! sendFollowUpMessage event ("Your training is **complete!**\n\n" + "But, you’re going to need more **HACKS & DEFENSES** 🛡 to survive in **Beautopia©...**\n" + $"You can purchase them from <@{GuildEnvironment.botArmory}>, at <#{GuildEnvironment.channelArmory}> anytime you want...\n\n" + "Go there **NOW** to buy **HACKS** & **SHIELDS** before you get hacked! 😱") }) let handleButtonEvent (event : ComponentInteractionCreateEventArgs) = async { let split = event.Id.Split("-") match int split.[1] with | 1 -> do! handleTrainerStep1 event |> Async.AwaitTask | 2 -> do! handleDefense event |> Async.AwaitTask | 3 -> do! handleTrainerStep3 event |> Async.AwaitTask | 4 -> do! handleAttack event |> Async.AwaitTask | _ -> do! sendFollowUpMessage event "No action found" }