From f354b9d6e820abfb6642d4a8b722efb231b3968d Mon Sep 17 00:00:00 2001 From: Joseph Ferano Date: Sat, 19 Feb 2022 22:38:42 +0700 Subject: [PATCH] Optimizing trainer so it hits the DB less often --- Bot/Game.fs | 6 ++-- Bot/GuildEnvironment.fs | 2 +- Bot/HackerBattle.fs | 2 +- Bot/Store.fs | 2 +- Bot/Thief.fs | 4 +-- Bot/Trainer.fs | 69 ++++++++++++++++++++--------------------- Shared/Shared.fs | 25 ++++++++++++--- 7 files changed, 62 insertions(+), 48 deletions(-) diff --git a/Bot/Game.fs b/Bot/Game.fs index 61fc7b5..af6ff61 100644 --- a/Bot/Game.fs +++ b/Bot/Game.fs @@ -19,7 +19,7 @@ module Game = let builder = DiscordInteractionResponseBuilder() builder.IsEphemeral <- true builder.Content <- "Content" - do! ctx.Respond InteractionResponseType.DeferredChannelMessageWithSource builder |> Async.AwaitTask + do! ctx.Respond(InteractionResponseType.DeferredChannelMessageWithSource, builder) |> Async.AwaitTask let! playerResult = tryFindPlayer (ctx.GetDiscordMember().Id) match playerResult with | Some player -> do! dispatch player @@ -31,7 +31,7 @@ module Game = let builder = DiscordInteractionResponseBuilder() builder.IsEphemeral <- true builder.Content <- "Content" - do! ctx.Respond InteractionResponseType.DeferredChannelMessageWithSource builder |> Async.AwaitTask + do! ctx.Respond(InteractionResponseType.DeferredChannelMessageWithSource, builder) |> Async.AwaitTask let! players = [ tryFindPlayer (ctx.GetDiscordMember().Id) tryFindPlayer targetPlayer.Id ] @@ -51,7 +51,7 @@ module Game = builder.IsEphemeral <- true builder.Content <- "Content" if defer then - do! ctx.Respond InteractionResponseType.DeferredChannelMessageWithSource builder |> Async.AwaitTask + do! ctx.Respond(InteractionResponseType.DeferredChannelMessageWithSource, builder) |> Async.AwaitTask let! players = [ tryFindPlayer (ctx.GetDiscordMember().Id) tryFindPlayer targetId ] diff --git a/Bot/GuildEnvironment.fs b/Bot/GuildEnvironment.fs index 8887276..81aa5ea 100644 --- a/Bot/GuildEnvironment.fs +++ b/Bot/GuildEnvironment.fs @@ -5,7 +5,7 @@ open System open DSharpPlus.Entities open dotenv.net DotEnv.Load(DotEnvOptions(envFilePaths = [ "../../../../.dev.env" ], overwriteExistingVars = false)) -//DotEnv.Load(DotEnvOptions(envFilePaths = [ "../../../../.sta.env" ], overwriteExistingVars = false)) +//DotEnv.Load(DotEnvOptions(envFilePaths = [ "../../../../.stag.env" ], overwriteExistingVars = false)) //DotEnv.Load(DotEnvOptions(envFilePaths = [ "../../../../.prod.env" ], overwriteExistingVars = false)) let getVar str = Environment.GetEnvironmentVariable(str) diff --git a/Bot/HackerBattle.fs b/Bot/HackerBattle.fs index 0b5f340..055ee7e 100644 --- a/Bot/HackerBattle.fs +++ b/Bot/HackerBattle.fs @@ -230,7 +230,7 @@ let handleButtonEvent (_ : DiscordClient) (event : ComponentInteractionCreateEve let builder = DiscordInteractionResponseBuilder() builder.IsEphemeral <- true builder.Content <- $"Incorrect Action identifier {eventCtx.GetInteractionId()}" - do! eventCtx.Respond InteractionResponseType.ChannelMessageWithSource builder |> Async.AwaitTask + do! eventCtx.Respond(InteractionResponseType.ChannelMessageWithSource, builder) |> Async.AwaitTask } type HackerGame() = diff --git a/Bot/Store.fs b/Bot/Store.fs index b5a7610..b1c009d 100644 --- a/Bot/Store.fs +++ b/Bot/Store.fs @@ -89,7 +89,7 @@ let handleStoreEvents (_ : DiscordClient) (event : ComponentInteractionCreateEve let builder = DiscordInteractionResponseBuilder() builder.IsEphemeral <- true builder.Content <- $"Incorrect Action identifier {id}" - do! ctx.Respond InteractionResponseType.ChannelMessageWithSource builder |> Async.AwaitTask + do! ctx.Respond(InteractionResponseType.ChannelMessageWithSource, builder) |> Async.AwaitTask } type Store() = diff --git a/Bot/Thief.fs b/Bot/Thief.fs index 2c9c4a9..30fc35a 100644 --- a/Bot/Thief.fs +++ b/Bot/Thief.fs @@ -245,7 +245,7 @@ let handleSteal (ctx : IDiscordContext) = async { let builder = DiscordInteractionResponseBuilder() builder.Content <- "I thought better of it" - do! ctx.Respond InteractionResponseType.UpdateMessage builder |> Async.AwaitTask + do! ctx.Respond(InteractionResponseType.UpdateMessage, builder) |> Async.AwaitTask } |> Async.StartAsTask :> Task let handleStealButton (_ : DiscordClient) (event : ComponentInteractionCreateEventArgs) = @@ -257,7 +257,7 @@ let handleStealButton (_ : DiscordClient) (event : ComponentInteractionCreateEve let builder = DiscordInteractionResponseBuilder() builder.IsEphemeral <- true builder.Content <- $"Incorrect Action identifier {eventCtx.GetInteractionId()}" - do! eventCtx.Respond InteractionResponseType.ChannelMessageWithSource builder |> Async.AwaitTask + do! eventCtx.Respond(InteractionResponseType.ChannelMessageWithSource, builder) |> Async.AwaitTask } type StealGame() = diff --git a/Bot/Trainer.fs b/Bot/Trainer.fs index 86656a6..18c8305 100644 --- a/Bot/Trainer.fs +++ b/Bot/Trainer.fs @@ -4,6 +4,7 @@ open System.Text open System.Threading.Tasks open DSharpPlus open DSharpPlus.Entities +open DSharpPlus.EventArgs open Degenz.Types open Degenz.Messaging @@ -48,29 +49,26 @@ let sendInitialEmbed (client : DiscordClient) = let handleTrainerStep1 (ctx : IDiscordContext) = async { - let builder = DiscordInteractionResponseBuilder() - builder.IsEphemeral <- true - builder.Content <- "Content" let role = ctx.GetGuild().GetRole(GuildEnvironment.roleTrainee) do! ctx.GetDiscordMember().GrantRoleAsync(role) |> Async.AwaitTask + let msg = "Beautopia© is a dangerous place... quick, put up a SHIELD 🛡 before another Degen hacks you, and steals your 💰$GBT.\n\n" + + "To enable it, you need to run the `/shield` slash command.\n\n" + + $"Type the `/shield` command now, then select - `{defaultShield.Name}`\n" + let builder = + DiscordInteractionResponseBuilder() + .WithContent(msg) + .AsEphemeral(true) - do! sendFollowUpMessage ctx - ("Beautopia© is a dangerous place... quick, put up a SHIELD 🛡 before another Degen hacks you, and steals your 💰$GBT.\n\n" - + "To enable it, you need to run the `/shield` slash command.\n\n" - + $"Type the `/shield` command now, then select - `{defaultShield.Name}`\n") + do! ctx.Respond(InteractionResponseType.ChannelMessageWithSource, builder) |> Async.AwaitTask } |> Async.StartAsTask :> Task let defend (ctx : IDiscordContext) = async { - let builder = DiscordInteractionResponseBuilder() - builder.IsEphemeral <- true - builder.Content <- "Content" - let builder = DiscordInteractionResponseBuilder() - builder.IsEphemeral <- true - builder.Content <- "Content" - do! ctx.Respond InteractionResponseType.DeferredChannelMessageWithSource builder |> Async.AwaitTask - let embed = Embeds.pickDefense "Trainer-2" { PlayerData.empty with Inventory = [| defaultShield |] } true + do! Messaging.defer ctx + let m = ctx.GetDiscordMember() + let name = if System.String.IsNullOrEmpty m.Nickname then m.DisplayName else m.Nickname + let embed = Embeds.pickDefense "Trainer-2" { PlayerData.empty with Inventory = [| defaultShield |] ; Name = name } true do! ctx.FollowUp(embed) |> Async.AwaitTask } |> Async.StartAsTask :> Task @@ -83,15 +81,13 @@ let handleDefenseMsg hackId = { let handleDefense (ctx : IDiscordContext) = async { - let builder = DiscordInteractionResponseBuilder() - builder.IsEphemeral <- true - builder.Content <- "Content" - do! ctx.Respond InteractionResponseType.DeferredChannelMessageWithSource builder |> Async.AwaitTask + do! Messaging.defer ctx + let sendMessage' = sendFollowUpMessage ctx let tokens = ctx.GetInteractionId().Split("-") let shieldId = enum(int tokens.[2]) let shield = Armory.getItem (int shieldId) - let playerName = enum(int tokens.[3]) + let playerName = tokens.[4] let embed = Embeds.responseCreatedShield shield do! ctx.FollowUp embed |> Async.AwaitTask do! Async.Sleep 4000 @@ -104,33 +100,36 @@ let handleDefense (ctx : IDiscordContext) = let handleTrainerStep3 (ctx : IDiscordContext) = async { - let builder = DiscordInteractionResponseBuilder() - builder.IsEphemeral <- true - builder.Content <- "Content" - do! ctx.Respond InteractionResponseType.DeferredChannelMessageWithSource builder |> Async.AwaitTask - do! sendFollowUpMessage ctx - ( "Now let’s **HACK** 💻... I want you to **HACK ME**!\n\n" - + "To **hack**, you need to run the `/hack` slash command.\n" - + $"Type the `/hack` command now, then choose me - <@{Sensei.Id}> as your target, and select `{defaultHack.Name}`") + let builder = + DiscordInteractionResponseBuilder() + .AsEphemeral(true) + .WithContent + ( "Now let’s **HACK** 💻... I want you to **HACK ME**!\n\n" + + "To **hack**, you need to run the `/hack` slash command.\n" + + $"Type the `/hack` command now, then choose me - <@{Sensei.Id}> as your target, and select `{defaultHack.Name}`") + + do! ctx.Respond(InteractionResponseType.ChannelMessageWithSource, builder) |> Async.AwaitTask } |> Async.StartAsTask :> Task let hack (target : DiscordUser) (ctx : IDiscordContext) = - Game.executePlayerAction ctx (fun player -> async { + async { + do! Messaging.defer ctx + let isRightTarget = target.Id = Sensei.Id match isRightTarget with | true -> let bot = { PlayerData.empty with DiscordId = Sensei.Id ; Name = Sensei.Name } - let embed = Embeds.pickHack "Trainer-4" { player with Inventory = [| defaultHack |] } bot true + let embed = Embeds.pickHack "Trainer-4" { PlayerData.empty with Inventory = [| defaultHack |] } bot true do! ctx.FollowUp(embed) |> Async.AwaitTask | false -> - let builder = DiscordFollowupMessageBuilder() - builder.Content <- "You picked the wrong target, you dufus. Try again, this time pick me!" - - builder.IsEphemeral <- true + let builder = + DiscordFollowupMessageBuilder() + .WithContent("You picked the wrong target, you dufus. Try again, this time pick me!") + .AsEphemeral(true) do! ctx.FollowUp(builder) |> Async.AwaitTask - }) + } |> Async.StartAsTask :> Task let handleHack (ctx : IDiscordContext) = Game.executePlayerAction ctx (fun player -> async { diff --git a/Shared/Shared.fs b/Shared/Shared.fs index fcfa385..bc2ccc7 100644 --- a/Shared/Shared.fs +++ b/Shared/Shared.fs @@ -160,7 +160,8 @@ module Messaging = | Event of ComponentInteractionCreateEventArgs type IDiscordContext = - abstract member Respond : InteractionResponseType -> DiscordInteractionResponseBuilder -> Task + abstract member Respond : InteractionResponseType -> Task + abstract member Respond : InteractionResponseType * DiscordInteractionResponseBuilder -> Task abstract member FollowUp : DiscordFollowupMessageBuilder -> Task abstract member GetDiscordMember : unit -> DiscordMember abstract member GetGuild : unit -> DiscordGuild @@ -170,7 +171,11 @@ module Messaging = type DiscordInteractionContext(ctx : InteractionContext) = interface IDiscordContext with - member this.Respond responseType builder = + member this.Respond responseType = + async { + do! ctx.Interaction.CreateResponseAsync(responseType) |> Async.AwaitTask + } |> Async.StartAsTask :> Task + member this.Respond (responseType, builder) = async { do! ctx.Interaction.CreateResponseAsync(responseType, builder) |> Async.AwaitTask } |> Async.StartAsTask :> Task @@ -186,7 +191,11 @@ module Messaging = type DiscordEventContext(ctx : ComponentInteractionCreateEventArgs) = interface IDiscordContext with - member this.Respond responseType builder = + member this.Respond responseType = + async { + do! ctx.Interaction.CreateResponseAsync(responseType) |> Async.AwaitTask + } |> Async.StartAsTask :> Task + member this.Respond (responseType, builder) = async { do! ctx.Interaction.CreateResponseAsync(responseType, builder) |> Async.AwaitTask } |> Async.StartAsTask :> Task @@ -218,12 +227,18 @@ module Messaging = let minutesRemaining = if remaining.Hours = 0 then remaining.Minutes + 1 else remaining.Minutes $"{hours}{minutesRemaining}min" + let defer (ctx: IDiscordContext) = async { + let builder = DiscordInteractionResponseBuilder() + builder.IsEphemeral <- true + do! ctx.Respond(InteractionResponseType.DeferredChannelMessageWithSource, builder) |> Async.AwaitTask + } + let sendSimpleResponse (ctx: IDiscordContext) msg = async { let builder = DiscordInteractionResponseBuilder() builder.Content <- msg builder.AsEphemeral true |> ignore - do! ctx.Respond InteractionResponseType.ChannelMessageWithSource builder |> Async.AwaitTask + do! ctx.Respond(InteractionResponseType.ChannelMessageWithSource, builder) |> Async.AwaitTask } let sendFollowUpMessage (ctx : IDiscordContext) msg = @@ -260,7 +275,7 @@ module Messaging = builder.AddComponents [| button |] |> ignore builder.IsEphemeral <- true builder.Content <- interactiveMessage.Message - do! ctx.Respond InteractionResponseType.UpdateMessage builder |> Async.AwaitTask + do! ctx.Respond(InteractionResponseType.UpdateMessage, builder) |> Async.AwaitTask } let handleResultWithResponse ctx fn (player : Result) =