diff --git a/Trainer/Trainer.fs b/Trainer/Trainer.fs index b934bf6..39de2a6 100644 --- a/Trainer/Trainer.fs +++ b/Trainer/Trainer.fs @@ -2,28 +2,72 @@ open System open System.Threading.Tasks open DSharpPlus open DSharpPlus.Entities +open DSharpPlus.EventArgs open DSharpPlus.SlashCommands open DegenzGame open DegenzGame.Shared +open Emzi0767.Utilities type EmptyGlobalCommandToAvoidFamousDuplicateSlashCommandsBug() = inherit ApplicationCommandModule () type Trainer() = inherit ApplicationCommandModule () - [] - member this.Attack (ctx : InteractionContext) = - async { - let! playerResult = DbService.tryFindPlayer ctx.Member.Id - return () - } |> Async.StartAsTask - :> Task - [] member this.DefendCommand (ctx : InteractionContext) = async { let! playerResult = DbService.tryFindPlayer ctx.Member.Id - return () + match playerResult with + | Some player -> + let builder = DiscordInteractionResponseBuilder() + builder.AddEmbed (constructEmbed "Pick a defense to mount for 24 hours") |> ignore + + constructButtons "Defend" (string player.DiscordId) player.Shields + |> Seq.cast + |> builder.AddComponents + |> ignore + + builder.AsEphemeral true |> ignore + + do! ctx.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource, builder) + |> Async.AwaitTask + | None -> + let builder = DiscordInteractionResponseBuilder() + builder.Content <- "Error, please contact a moderator" + + builder.AsEphemeral true |> ignore + + do! ctx.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource, builder) + |> Async.AwaitTask + } |> Async.StartAsTask + :> Task + + [] + member this.Attack (ctx : InteractionContext) = + async { + let! playerResult = DbService.tryFindPlayer ctx.Member.Id + match playerResult with + | Some player -> + let builder = DiscordInteractionResponseBuilder() + builder.AddEmbed (constructEmbed "Pick an attack to use on your target") |> ignore + + constructButtons "Attack" (string player.DiscordId) player.Weapons + |> Seq.cast + |> builder.AddComponents + |> ignore + + builder.AsEphemeral true |> ignore + + do! ctx.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource, builder) + |> Async.AwaitTask + | None -> + let builder = DiscordInteractionResponseBuilder() + builder.Content <- "Error, please contact a moderator" + + builder.AsEphemeral true |> ignore + + do! ctx.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource, builder) + |> Async.AwaitTask } |> Async.StartAsTask :> Task @@ -37,6 +81,86 @@ let client = new DiscordClient(config) let slash = client.UseSlashCommands() +let sendMessage (event : ComponentInteractionCreateEventArgs) msg = + async { + let builder = DiscordFollowupMessageBuilder() + builder.IsEphemeral <- true + builder.Content <- msg + do! event.Interaction.CreateFollowupMessageAsync(builder) + |> Async.AwaitTask + |> Async.Ignore + do! Async.Sleep 4000 + } + +let handleInitialDialog (event : ComponentInteractionCreateEventArgs) = + let sendMessage' = sendMessage event + async { + do! event.Interaction.CreateResponseAsync(InteractionResponseType.DeferredMessageUpdate) + |> Async.AwaitTask + + let! result = DbService.tryFindPlayer event.User.Id + match result with + | Some player -> + do! sendMessage' "The Degenz world is a dangerous place. I'm going to teach you how to protect yourself from other degenerates." + do! sendMessage' "And in the process, I'll also show you how to hack these sheeple, so you can earn some cash." + do! sendMessage' "First thing is first, let's get your system protected. Let's put up a shield." + let weaponName = player.Shields |> Array.tryHead |> Option.defaultValue Shield.Firewall + do! sendMessage' $"You currently have {weaponName} in your arsenal. To enable it and protect your system, run the `/defend` command and select '{weaponName}'" + | None -> + do! sendMessage' $"Something went wrong, please contact a moderator" + } + +let handleDefense (event : ComponentInteractionCreateEventArgs) = + let sendMessage' = sendMessage event + async { + do! event.Interaction.CreateResponseAsync(InteractionResponseType.DeferredMessageUpdate) + |> Async.AwaitTask + let! result = DbService.tryFindPlayer event.User.Id + match result with + | Some player -> + let prize = 0.223f + do! sendMessage' $"{event.User.Username} has protected their system!" + do! sendMessage' "Ok, good, let me make sure that worked. I'll try to hack you now" + do! sendMessage' $"Hacking attempt failed! {player.Name} defended hack from Degenz-Trainer and took {prize} from them! " + do! sendMessage' "Great, I wasn't able to hack you. Great job! Because you had your system protected, when I tried to hack you, I lost some money and had to give it to you" + do! sendMessage' "But you can make even more by successfully hacking your target. Why don't you try hacking me?" + let weaponName = player.Weapons |> Array.tryHead |> Option.defaultValue Weapon.Virus + do! sendMessage' $"You currently have {weaponName} equipped. To attempt a hack, type the '/hack' command and select {weaponName}." + | None -> + do! sendMessage' $"Something went wrong, please contact a moderator" + } + +let handleAttack (event : ComponentInteractionCreateEventArgs) = + let sendMessage' = sendMessage event + async { + do! event.Interaction.CreateResponseAsync(InteractionResponseType.DeferredMessageUpdate) + |> Async.AwaitTask + let! result = DbService.tryFindPlayer event.User.Id + match result with + | Some player -> + let prize = 1.337f // LEET + do! sendMessage' $"{player.Name} successfully hacked Degenz-Trainer for a total of {prize} GoodBoyTokenz" + do! sendMessage' "Looks like you got the hang of it. By successfully hacking other people you can earn some GoodBoyTokenz" + do! sendMessage' "I think we're done for now. If you wish to purchase more hacks or shields, you go to the store to purchase them." + do! sendMessage' "Alright you degenerate, off you go!" + | None -> + do! sendMessage' $"Something went wrong, please contact a moderator" + } + +let handleButtonEvent (_ : DiscordClient) (event : ComponentInteractionCreateEventArgs) = + async { + match event.Id with + | id when id.StartsWith("Trainer") -> do! handleInitialDialog event + | id when id.StartsWith("Defend") -> do! handleDefense event + | id when id.StartsWith("Attack") -> do! handleAttack event + | _ -> do! sendMessage event "No action found" + } + |> Async.StartAsTask + :> Task + + +client.add_ComponentInteractionCreated(AsyncEventHandler(handleButtonEvent)) + // My server slash.RegisterCommands(922419263275425832uL); // Degenz @@ -46,6 +170,18 @@ client.ConnectAsync () |> Async.AwaitTask |> Async.RunSynchronously +async { + let! channel = client.GetChannelAsync(933298431521333258uL) |> Async.AwaitTask + let builder = DiscordMessageBuilder() + builder.Content <- "Welcome to the trainer bot, are you ready to get started?" + let button = DiscordButtonComponent(ButtonStyle.Success, $"Trainer-trainer-1", $"Get started") :> DiscordComponent + builder.AddComponents [| button |] |> ignore + do! channel.SendMessageAsync(builder) + |> Async.AwaitTask + |> Async.Ignore +} |> Async.RunSynchronously + + Task.Delay(-1) |> Async.AwaitTask |> Async.RunSynchronously diff --git a/Trainer/Trainer.fsproj b/Trainer/Trainer.fsproj index b728b5a..48ccd28 100644 --- a/Trainer/Trainer.fsproj +++ b/Trainer/Trainer.fsproj @@ -1,9 +1,9 @@  - Exe net6.0 Linux + Exe