Optimizing from training steps

This commit is contained in:
Joseph Ferano 2022-02-19 20:16:14 +07:00
parent 8652828892
commit cacd9a32b1
5 changed files with 39 additions and 28 deletions

View File

@ -33,16 +33,16 @@ let getShieldGif = function
| ShieldId.Cypher -> "https://s10.gifyu.com/images/Cypher-Smaller.gif" | ShieldId.Cypher -> "https://s10.gifyu.com/images/Cypher-Smaller.gif"
| _ -> shieldGif | _ -> shieldGif
let constructButtons (actionId: string) (buttonInfo : string) (player: PlayerData) itemType isTrainer = let constructButtons (actionId: string) (buttonInfo : string) (player: PlayerData) itemType ignoreCooldown =
player player
|> Player.getItems itemType |> Player.getItems itemType
|> Array.map (fun item -> |> Array.map (fun item ->
let action = let action =
player.Events player.Events
|> Array.tryFind (fun i -> i.ItemId = item.Id) |> Array.tryFind (fun i -> i.ItemId = item.Id)
match action , isTrainer with match action , ignoreCooldown with
| None , _ | Some _ , true -> | None , _ | Some _ , true ->
DiscordButtonComponent(ButtonStyle.Primary, $"{actionId}-{item.Id}-{buttonInfo}", $"{item.Name}") DiscordButtonComponent(ButtonStyle.Primary, $"{actionId}-{item.Id}-{buttonInfo}-{player.Name}", $"{item.Name}")
| Some act , false -> | Some act , false ->
let c = ((Armory.getItem act.ItemId).Cooldown) let c = ((Armory.getItem act.ItemId).Cooldown)
let time = Messaging.getShortTimeText (TimeSpan.FromMinutes(int c)) act.Timestamp let time = Messaging.getShortTimeText (TimeSpan.FromMinutes(int c)) act.Timestamp

View File

@ -139,10 +139,10 @@ let attack (target : DiscordUser) (ctx : IDiscordContext) =
let handleAttack (ctx : IDiscordContext) = let handleAttack (ctx : IDiscordContext) =
Game.executePlayerAction ctx (fun attacker -> async { Game.executePlayerAction ctx (fun attacker -> async {
let split = ctx.GetInteractionId().Split("-") let tokens = ctx.GetInteractionId().Split("-")
let hackId = int split.[1] let hackId = int tokens.[1]
let hack = Armory.getItem hackId let hack = Armory.getItem hackId
let resultId , targetId = UInt64.TryParse split.[2] let resultId , targetId = UInt64.TryParse tokens.[2]
let! resultTarget = DbService.tryFindPlayer targetId let! resultTarget = DbService.tryFindPlayer targetId
match resultTarget , true , resultId with match resultTarget , true , resultId with
@ -175,8 +175,8 @@ let defend (ctx : IDiscordContext) =
let handleDefense (ctx : IDiscordContext) = let handleDefense (ctx : IDiscordContext) =
Game.executePlayerAction ctx (fun player -> async { Game.executePlayerAction ctx (fun player -> async {
let split = ctx.GetInteractionId().Split("-") let tokens = ctx.GetInteractionId().Split("-")
let shieldId = int split.[1] let shieldId = int tokens.[1]
let shield = Armory.getItem shieldId let shield = Armory.getItem shieldId
do! player do! player

View File

@ -96,10 +96,10 @@ let playRPS target ctx =
}) })
let handleRPS (ctx : IDiscordContext) = let handleRPS (ctx : IDiscordContext) =
let split = ctx.GetInteractionId().Split("-") let tokens = ctx.GetInteractionId().Split("-")
let move = split.[1] let move = tokens.[1]
let targetId = uint64 split.[2] let targetId = uint64 tokens.[2]
let isResponse = split.[4] = "True" let isResponse = tokens.[4] = "True"
Game.executePlayerActionWithTargetId false targetId ctx (fun attacker defender -> async { Game.executePlayerActionWithTargetId false targetId ctx (fun attacker defender -> async {
if isResponse then if isResponse then
let eventCtx = ctx.GetContext() :?> ComponentInteractionCreateEventArgs let eventCtx = ctx.GetContext() :?> ComponentInteractionCreateEventArgs
@ -111,7 +111,7 @@ let handleRPS (ctx : IDiscordContext) =
.AsEphemeral(true) .AsEphemeral(true)
do! eventCtx.Interaction.CreateResponseAsync(InteractionResponseType.UpdateMessage, builder) |> Async.AwaitTask do! eventCtx.Interaction.CreateResponseAsync(InteractionResponseType.UpdateMessage, builder) |> Async.AwaitTask
let move1 = moveFromString move let move1 = moveFromString move
let move2 = moveFromString split.[5] let move2 = moveFromString tokens.[5]
let winner = getWinner move1 move2 let winner = getWinner move1 move2
let embeds = matchResultsEmbed winner move1 move2 attacker defender |> Seq.map (fun e -> e.Build()) let embeds = matchResultsEmbed winner move1 move2 attacker defender |> Seq.map (fun e -> e.Build())
let builder = DiscordMessageBuilder().AddEmbeds(embeds) let builder = DiscordMessageBuilder().AddEmbeds(embeds)

View File

@ -159,13 +159,13 @@ let steal target amount (ctx : IDiscordContext) =
}) })
let handleSteal (ctx : IDiscordContext) = let handleSteal (ctx : IDiscordContext) =
let split = ctx.GetInteractionId().Split("-") let tokens = ctx.GetInteractionId().Split("-")
let answer = split.[1] let answer = tokens.[1]
let handleYes (victim : PlayerData) (thief : PlayerData) = async { let handleYes (victim : PlayerData) (thief : PlayerData) = async {
let targetId = uint64 split.[2] let targetId = uint64 tokens.[2]
let targetName = split.[3] let targetName = tokens.[3]
let amount = int split.[4] let amount = int tokens.[4]
let prize , winPercentage , _ = calculateWinPercentage amount (int victim.Bank) thief.Traits.Strength victim.Traits.Strength let prize , winPercentage , _ = calculateWinPercentage amount (int victim.Bank) thief.Traits.Strength victim.Traits.Strength
let prize = int prize * 1<GBT> let prize = int prize * 1<GBT>
@ -233,7 +233,7 @@ let handleSteal (ctx : IDiscordContext) =
do! ctx.GetDiscordMember().GrantRoleAsync(role) |> Async.AwaitTask do! ctx.GetDiscordMember().GrantRoleAsync(role) |> Async.AwaitTask
} }
if answer = "yes" then if answer = "yes" then
let targetId = uint64 split.[2] let targetId = uint64 tokens.[2]
Game.executePlayerActionWithTargetId true targetId ctx (fun attacker defender -> async { Game.executePlayerActionWithTargetId true targetId ctx (fun attacker defender -> async {
do! attacker do! attacker
|> Player.removeExpiredActions |> Player.removeExpiredActions

View File

@ -47,7 +47,10 @@ let sendInitialEmbed (client : DiscordClient) =
} |> Async.RunSynchronously } |> Async.RunSynchronously
let handleTrainerStep1 (ctx : IDiscordContext) = let handleTrainerStep1 (ctx : IDiscordContext) =
Game.executePlayerAction ctx (fun player -> async { async {
let builder = DiscordInteractionResponseBuilder()
builder.IsEphemeral <- true
builder.Content <- "Content"
let role = ctx.GetGuild().GetRole(GuildEnvironment.roleTrainee) let role = ctx.GetGuild().GetRole(GuildEnvironment.roleTrainee)
do! ctx.GetDiscordMember().GrantRoleAsync(role) do! ctx.GetDiscordMember().GrantRoleAsync(role)
|> Async.AwaitTask |> Async.AwaitTask
@ -56,10 +59,13 @@ let handleTrainerStep1 (ctx : IDiscordContext) =
("Beautopia© is a dangerous place... quick, put up a SHIELD 🛡 before another Degen hacks you, and steals your 💰$GBT.\n\n" ("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" + "To enable it, you need to run the `/shield` slash command.\n\n"
+ $"Type the `/shield` command now, then select - `{defaultShield.Name}`\n") + $"Type the `/shield` command now, then select - `{defaultShield.Name}`\n")
}) } |> Async.StartAsTask :> Task
let defend (ctx : IDiscordContext) = let defend (ctx : IDiscordContext) =
async { async {
let builder = DiscordInteractionResponseBuilder()
builder.IsEphemeral <- true
builder.Content <- "Content"
let builder = DiscordInteractionResponseBuilder() let builder = DiscordInteractionResponseBuilder()
builder.IsEphemeral <- true builder.IsEphemeral <- true
builder.Content <- "Content" builder.Content <- "Content"
@ -76,20 +82,25 @@ let handleDefenseMsg hackId = {
} }
let handleDefense (ctx : IDiscordContext) = let handleDefense (ctx : IDiscordContext) =
Game.executePlayerAction ctx (fun player -> async { async {
let builder = DiscordInteractionResponseBuilder()
builder.IsEphemeral <- true
builder.Content <- "Content"
do! ctx.Respond InteractionResponseType.DeferredChannelMessageWithSource builder |> Async.AwaitTask
let sendMessage' = sendFollowUpMessage ctx let sendMessage' = sendFollowUpMessage ctx
let split = ctx.GetInteractionId().Split("-") let tokens = ctx.GetInteractionId().Split("-")
let shieldId = enum<ShieldId>(int split.[2]) let shieldId = enum<ShieldId>(int tokens.[2])
let shield = Armory.getItem (int shieldId) let shield = Armory.getItem (int shieldId)
let playerName = enum<ShieldId>(int tokens.[3])
let embed = Embeds.responseCreatedShield shield let embed = Embeds.responseCreatedShield shield
do! ctx.FollowUp embed |> Async.AwaitTask do! ctx.FollowUp embed |> Async.AwaitTask
do! Async.Sleep 4000 do! Async.Sleep 4000
do! sendMessage' $"Ok, good, let me make sure that worked.\n\nI'll try to **hack** you now with **{defaultHack.Name}**" do! sendMessage' $"Ok, good, let me make sure that worked.\n\nI'll try to **hack** you now with **{defaultHack.Name}**"
do! Async.Sleep 5000 do! Async.Sleep 5000
do! sendMessage' $"❌ HACKING FAILED!\n\n{player.Name} defended hack from <@{Sensei.Id}>!" do! sendMessage' $"❌ HACKING FAILED!\n\n{playerName} defended hack from <@{Sensei.Id}>!"
do! Async.Sleep 4000 do! Async.Sleep 4000
do! sendFollowUpMessageWithButton ctx (handleDefenseMsg defaultHack.Name) do! sendFollowUpMessageWithButton ctx (handleDefenseMsg defaultHack.Name)
}) } |> Async.StartAsTask :> Task
let handleTrainerStep3 (ctx : IDiscordContext) = let handleTrainerStep3 (ctx : IDiscordContext) =
async { async {
@ -184,8 +195,8 @@ let handleArsenal (ctx : IDiscordContext) =
let handleButtonEvent (ctx : IDiscordContext) = let handleButtonEvent (ctx : IDiscordContext) =
async { async {
let split = ctx.GetInteractionId().Split("-") let tokens = ctx.GetInteractionId().Split("-")
match int split.[1] with match int tokens.[1] with
| 1 -> do! handleTrainerStep1 ctx |> Async.AwaitTask | 1 -> do! handleTrainerStep1 ctx |> Async.AwaitTask
| 2 -> do! handleDefense ctx |> Async.AwaitTask | 2 -> do! handleDefense ctx |> Async.AwaitTask
| 3 -> do! handleTrainerStep3 ctx |> Async.AwaitTask | 3 -> do! handleTrainerStep3 ctx |> Async.AwaitTask