From 893fe1133d2e1a98ac7b616c9d90898ee1dc788b Mon Sep 17 00:00:00 2001 From: Joseph Ferano Date: Thu, 7 Apr 2022 13:58:18 +0700 Subject: [PATCH] New improved slots, improve admin commands, GetInteraction() --- .gitignore | 1 + Bot/Admin.fs | 18 ++- Bot/Bot.fs | 51 ++++---- Bot/DbService.fs | 4 +- Bot/Games/SlotMachine.fs | 248 +++++++++++++++++++++++++++++---------- Bot/GuildEnvironment.fs | 1 + Bot/InviteTracker.fs | 12 +- Bot/Messaging.fs | 3 + 8 files changed, 245 insertions(+), 93 deletions(-) diff --git a/.gitignore b/.gitignore index 9fa882c..dc2cfbc 100644 --- a/.gitignore +++ b/.gitignore @@ -456,3 +456,4 @@ $RECYCLE.BIN/ !.vscode/extensions.json *.org /.paket/load/ +/Images/ diff --git a/Bot/Admin.fs b/Bot/Admin.fs index 69c85fc..b55251b 100644 --- a/Bot/Admin.fs +++ b/Bot/Admin.fs @@ -1,10 +1,24 @@ module Degenz.Admin open System.Threading.Tasks +open DSharpPlus open DSharpPlus.Entities +open DSharpPlus.EventArgs open DSharpPlus.SlashCommands +open DSharpPlus.SlashCommands.Attributes open Degenz.Messaging +let handleGuildDownloadReady (_ : DiscordClient) (event : GuildDownloadCompletedEventArgs) = + task { + let ( _ , guild ) = event.Guilds.TryGetValue(GuildEnvironment.guildId) + let! commands = guild.GetApplicationCommandsAsync() + let ( _ , adminRole ) = guild.Roles.TryGetValue(GuildEnvironment.roleAdmin) + + let permission = DiscordApplicationCommandPermission(adminRole, true) + let commands = commands |> Seq.map (fun com -> DiscordGuildApplicationCommandPermissions(com.Id, [ permission ])) + do! guild.BatchEditApplicationCommandPermissionsAsync(commands) |> Async.AwaitTask |> Async.Ignore + } :> Task + type AdminBot() = inherit ApplicationCommandModule () @@ -15,10 +29,10 @@ type AdminBot() = else Messaging.sendSimpleResponse ctx $"You are not admin" |> Async.StartAsTask :> Task - [] + [] member this.GetAttributions (ctx : InteractionContext, [] user : DiscordUser) = enforceAdmin (DiscordInteractionContext ctx) (InviteTracker.getInvitedUsersForId) - [] + [] member this.SetStock (ctx : InteractionContext, [] amount : int64) = enforceAdmin (DiscordInteractionContext ctx) (InviteTracker.setWhitelistStock (int amount)) diff --git a/Bot/Bot.fs b/Bot/Bot.fs index 73c4c58..2d8ce5e 100644 --- a/Bot/Bot.fs +++ b/Bot/Bot.fs @@ -3,6 +3,7 @@ module Degenz.Bot open System.IO open System.Threading.Tasks open DSharpPlus +open DSharpPlus.Entities open DSharpPlus.SlashCommands open Degenz open Emzi0767.Utilities @@ -16,9 +17,9 @@ let hackerBattleConfig = DiscordConfiguration() let storeConfig = DiscordConfiguration() let stealConfig = DiscordConfiguration() let inviterConfig = DiscordConfiguration() +let slotsConfig = DiscordConfiguration() let adminConfig = DiscordConfiguration() -//let slotMachineConfig = DiscordConfiguration() -//hackerBattleConfig.MinimumLogLevel <- Microsoft.Extensions.Logging.LogLevel.Trace +//adminConfig.MinimumLogLevel <- Microsoft.Extensions.Logging.LogLevel.Trace //storeConfig.MinimumLogLevel <- Microsoft.Extensions.Logging.LogLevel.Trace hackerBattleConfig.TokenType <- TokenType.Bot @@ -33,6 +34,9 @@ stealConfig.Intents <- DiscordIntents.All inviterConfig.TokenType <- TokenType.Bot inviterConfig.Intents <- DiscordIntents.All +slotsConfig.TokenType <- TokenType.Bot +slotsConfig.Intents <- DiscordIntents.All + adminConfig.TokenType <- TokenType.Bot adminConfig.Intents <- DiscordIntents.All @@ -40,31 +44,29 @@ hackerBattleConfig.Token <- GuildEnvironment.tokenHackerBattle storeConfig.Token <- GuildEnvironment.tokenStore stealConfig.Token <- GuildEnvironment.tokenSteal inviterConfig.Token <- GuildEnvironment.tokenInviter +slotsConfig.Token <- GuildEnvironment.tokenSlots adminConfig.Token <- GuildEnvironment.tokenAdmin -//slotMachineConfig.Token <- Environment.GetEnvironmentVariable("BOT_SLOT_MACHINE") let hackerBattleBot = new DiscordClient(hackerBattleConfig) let storeBot = new DiscordClient(storeConfig) let stealBot = new DiscordClient(stealConfig) let inviterBot = new DiscordClient(inviterConfig) +let slotsBot = new DiscordClient(slotsConfig) let adminBot = new DiscordClient(adminConfig) -//let slotMachineBot = new DiscordClient(slotMachineConfig) -//let clients = [| hackerBattleBot ; storeBot ; slotMachineBot |] let hackerCommands = hackerBattleBot.UseSlashCommands() let storeCommands = storeBot.UseSlashCommands() let stealCommands = stealBot.UseSlashCommands() let inviterCommands = inviterBot.UseSlashCommands() +let slotsCommands = slotsBot.UseSlashCommands() let adminCommands = adminBot.UseSlashCommands() -//let sc3 = slotMachineBot.UseSlashCommands() hackerCommands.RegisterCommands(guild); storeCommands.RegisterCommands(guild); stealCommands.RegisterCommands(guild); inviterCommands.RegisterCommands(guild); -adminCommands.RegisterCommands(guild); -//hackerCommands.RegisterCommands(guild); -//sc3.RegisterCommands(guild); +slotsCommands.RegisterCommands(guild); +adminCommands.RegisterCommands(guild) hackerBattleBot.add_ComponentInteractionCreated(AsyncEventHandler(HackerBattle.handleButtonEvent)) hackerBattleBot.add_MessageCreated(AsyncEventHandler(HackerBattle.handleMessageCreated)) @@ -72,7 +74,8 @@ storeBot.add_ComponentInteractionCreated(AsyncEventHandler(Store.handleStoreEven stealBot.add_ComponentInteractionCreated(AsyncEventHandler(Thief.handleStealButton)) inviterBot.add_GuildMemberAdded(AsyncEventHandler(InviteTracker.handleGuildMemberAdded)) inviterBot.add_ComponentInteractionCreated(AsyncEventHandler(InviteTracker.handleButtonEvent)) -//inviterBot.add_GuildMemberRemoved(AsyncEventHandler(InviteTracker.handleGuildMemberRemoved)) +slotsBot.add_ComponentInteractionCreated(AsyncEventHandler(SlotMachine.handleSpin)) +adminBot.add_GuildDownloadCompleted(AsyncEventHandler(Admin.handleGuildDownloadReady)) let asdf (_ : DiscordClient) (event : DSharpPlus.EventArgs.InteractionCreateEventArgs) = async { @@ -90,21 +93,25 @@ let asdf (_ : DiscordClient) (event : DSharpPlus.EventArgs.InteractionCreateEven :> Task //hackerBattleBot.add_InteractionCreated(AsyncEventHandler(asdf)) +slotsBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously + +//hackerBattleBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously +//GuildEnvironment.botUserHackerBattle <- Some hackerBattleBot.CurrentUser + +//storeBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously +//GuildEnvironment.botUserArmory <- Some storeBot.CurrentUser + +//inviterBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously +//GuildEnvironment.botClientRecruit <- Some inviterBot + + +//adminBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously +//stealBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously + //if guild <> 922419263275425832uL then // Trainer.sendInitialEmbed hackerBattleBot // InviteTracker.sendInitialEmbed inviterBot - -hackerBattleBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously -GuildEnvironment.botUserHackerBattle <- Some hackerBattleBot.CurrentUser - -storeBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously -GuildEnvironment.botUserArmory <- Some storeBot.CurrentUser - -inviterBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously -GuildEnvironment.botClientRecruit <- Some inviterBot - -adminBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously -//stealBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously +SlotMachine.sendInitialEmbed slotsBot let rec loop areBotsRunning = async { diff --git a/Bot/DbService.fs b/Bot/DbService.fs index 2f0eb5f..53b7655 100644 --- a/Bot/DbService.fs +++ b/Bot/DbService.fs @@ -103,7 +103,7 @@ let tryFindPlayer (discordId : uint64) = async { return None } -let updatePlayerCurrency addAmount (player : PlayerData) = +let updatePlayerCurrency (addAmount : int) (player : PlayerData) = connStr |> Sql.connect |> Sql.parameters [ @@ -257,7 +257,7 @@ let getWhitelistItem () = |> Sql.query """ SELECT stock, price FROM item WHERE symbol = 'WHITELIST' """ - |> Sql.executeRowAsync (fun read -> {| Stock = read.int "stock" ; Price = read.int "price" |}) + |> Sql.executeRowAsync (fun read -> {| Stock = read.int "stock" ; Price = (read.int "price") * 1 |}) |> Async.AwaitTask let updateWhitelistStock () = async { diff --git a/Bot/Games/SlotMachine.fs b/Bot/Games/SlotMachine.fs index d40a1b3..20a6ed3 100644 --- a/Bot/Games/SlotMachine.fs +++ b/Bot/Games/SlotMachine.fs @@ -1,76 +1,202 @@ module Degenz.SlotMachine open System +open System.IO +open System.Threading.Tasks open DSharpPlus open DSharpPlus.Entities +open DSharpPlus.EventArgs open DSharpPlus.SlashCommands open Degenz.Messaging open Degenz.Types -let slots = [| "https://i.ibb.co/pKqZdr7/cherry.png" ; "https://i.ibb.co/JnghQsL/lemon.jpg" ; "https://i.ibb.co/1JTFPSs/seven.png" |] +let slots = +// [| +// "https://s7.gifyu.com/images/A-bottle-of-pills.png" +// "https://s7.gifyu.com/images/an-eye.png" +// "https://s7.gifyu.com/images/anon-face-mask.png" +// "https://s7.gifyu.com/images/a-piece-of-sushi.png" +// "https://s7.gifyu.com/images/Circuit-board.png" +// "https://s7.gifyu.com/images/OBEY.png" +// "https://s7.gifyu.com/images/old-tv-screen.png" +// "https://s7.gifyu.com/images/pizza.png" +// "https://s7.gifyu.com/images/ramen.png" +// "https://s7.gifyu.com/images/rat.png" +//|] + [| + "https://s7.gifyu.com/images/A-bottle-of-pills0a3006d0170e08df.png" + "https://s7.gifyu.com/images/an-eyec362d8152ae2382b.png" + "https://s7.gifyu.com/images/anon-face-mask6c7624821c89fc08.png" + "https://s7.gifyu.com/images/a-piece-of-sushi77071d30f60a89c6.png" + "https://s7.gifyu.com/images/Circuit-board89056017b80f1d13.png" + "https://s7.gifyu.com/images/OBEYf2a8234109836c03.png" + "https://s7.gifyu.com/images/old-tv-screendc6bc9d4b6c1fd65.png" + "https://s7.gifyu.com/images/pizza030ffc00ff50da0e.png" + "https://s7.gifyu.com/images/ramen08336d448018c98f.png" + "https://s7.gifyu.com/images/rat14f65f54f0d75036.png" +|] +let slotsLocal = + [| + "/home/joe/Development/DegenzGame/Images/SlotMachine/new/A bottle of pills.png" + "/home/joe/Development/DegenzGame/Images/SlotMachine/new/a piece of sushi.png" + "/home/joe/Development/DegenzGame/Images/SlotMachine/new/an eye.png" + "/home/joe/Development/DegenzGame/Images/SlotMachine/new/anon face mask.png" + "/home/joe/Development/DegenzGame/Images/SlotMachine/new/Circuit board.png" + "/home/joe/Development/DegenzGame/Images/SlotMachine/new/OBEY.png" + "/home/joe/Development/DegenzGame/Images/SlotMachine/new/old tv screen.png" + "/home/joe/Development/DegenzGame/Images/SlotMachine/new/pizza.png" + "/home/joe/Development/DegenzGame/Images/SlotMachine/new/ramen.png" + "/home/joe/Development/DegenzGame/Images/SlotMachine/new/rat.png" +|] + +let PlayPrice = 10 +let twoOfAKindPrize = 100 +let threeOfAKindPrize = 1000 +let fourOfAKindPrize = 10000 + +let spin (ctx : IDiscordContext) = + PlayerInteractions.executePlayerAction ctx (fun player -> async { + let sleepTime = 1000 + let random = Random(System.Guid.NewGuid().GetHashCode()) + let slotCount = slots.Length + let results = [ random.Next(0, slotCount) ; random.Next(0, slotCount) ; random.Next(0, slotCount) ] + + let winConditions = (results.[0] = results.[1] && results.[0] = results.[2]) + || (results.[0] <> results.[1] && results.[1] <> results.[2] && results.[0] <> results.[2]) + + if winConditions + then do! DbService.updatePlayerCurrency twoOfAKindPrize player |> Async.Ignore + else do! DbService.updatePlayerCurrency -PlayPrice player |> Async.Ignore + + let embed1 = DiscordEmbedBuilder() + embed1.ImageUrl <- slots.[results.[0]] + let embed2 = DiscordEmbedBuilder() + embed2.ImageUrl <- slots.[results.[1]] + let embed3 = DiscordEmbedBuilder() + embed3.ImageUrl <- slots.[results.[2]] + let embed4 = DiscordEmbedBuilder() + embed4.Title <- "Slot Machine" + embed4.Description <- "You hit the jackpot!" + + let iCtx = ctx.GetInteraction() + + let builder = DiscordFollowupMessageBuilder() +// let embed = DiscordEmbedBuilder() +// embed.ImageUrl <- slots.[results.[0]] +// builder.AddEmbed(embed.Build()) |> ignore + + builder.Content <- "Spinning!" + builder.IsEphemeral <- true + + let! followUp = iCtx.CreateFollowupMessageAsync(builder) |> Async.AwaitTask + do! Async.Sleep 1500 + use f1 = new FileStream(slotsLocal.[0], FileMode.Open) + let! _ = iCtx.EditFollowupMessageAsync(followUp.Id, DiscordWebhookBuilder().AddFile(f1)) |> Async.AwaitTask + do! Async.Sleep 1500 + use f2 = new FileStream(slotsLocal.[1], FileMode.Open) + let! _ = iCtx.EditFollowupMessageAsync(followUp.Id, DiscordWebhookBuilder().AddFile(f2)) |> Async.AwaitTask + do! Async.Sleep 1500 + use f3 = new FileStream(slotsLocal.[2], FileMode.Open) + let! _ = iCtx.EditFollowupMessageAsync(followUp.Id, DiscordWebhookBuilder().AddFile(f3)) |> Async.AwaitTask + + do! Async.Sleep 1500 + + let! _ = iCtx.EditFollowupMessageAsync(followUp.Id, DiscordWebhookBuilder().AddEmbed(embed1)) |> Async.AwaitTask + do! Async.Sleep 1500 + let! _ = iCtx.EditFollowupMessageAsync(followUp.Id, DiscordWebhookBuilder().AddEmbeds([embed1.Build() ; embed2.Build()])) |> Async.AwaitTask + do! Async.Sleep 1500 + let! _ = iCtx.EditFollowupMessageAsync(followUp.Id, DiscordWebhookBuilder().AddEmbeds([embed1.Build() ; embed2.Build() ; embed3.Build() ])) |> Async.AwaitTask + do! Async.Sleep 1500 + let! _ = iCtx.EditFollowupMessageAsync(followUp.Id, DiscordWebhookBuilder().AddEmbeds([embed1.Build() ; embed2.Build() ; embed3.Build() ; embed4.Build() ])) |> Async.AwaitTask + return () + +// do! Async.Sleep sleepTime +// let builder = DiscordFollowupMessageBuilder() +// let embed = DiscordEmbedBuilder() +// embed.ImageUrl <- slots.[results.[0]] +// builder.AddEmbed(embed.Build()) |> ignore +// +// do! Async.Sleep sleepTime +// let builder = DiscordFollowupMessageBuilder() +// embed.ImageUrl <- slots.[results.[1]] +// builder.AddEmbed(embed.Build()) |> ignore +// +// do! Async.Sleep sleepTime +// let builder = DiscordFollowupMessageBuilder() +// embed.ImageUrl <- slots.[results.[2]] +// builder.AddEmbed(embed.Build()) |> ignore +// +// if winConditions then +// do! Async.Sleep sleepTime +// let builder = DiscordFollowupMessageBuilder() +// builder.Content <- "You win 10 GBT!" +// do! ctx.FollowUp(builder) +// |> Async.AwaitTask +// |> Async.Ignore +// else +// do! Async.Sleep sleepTime +// let builder = DiscordFollowupMessageBuilder() +// builder.Content <- "You lose 0.5 GBT! Try your luck again!" +// do! ctx.FollowUp(builder) +// |> Async.AwaitTask +// |> Async.Ignore + }) + +let handleSpin (_ : DiscordClient) (event : ComponentInteractionCreateEventArgs) = + task { + do! spin (DiscordEventContext event) + } :> Task + +let spinCommand (ctx : IDiscordContext) = + async { + try + let builder = DiscordInteractionResponseBuilder() + builder.Content <- "The message" + builder.IsEphemeral <- true + let button = DiscordButtonComponent(ButtonStyle.Success, $"spin", $"Spin Me Right Around") :> DiscordComponent + builder.AddComponents [| button |] |> ignore + do! ctx.Respond(InteractionResponseType.ChannelMessageWithSource, builder) + |> Async.AwaitTask + |> Async.Ignore + with e -> + printfn $"Error trying to get channel Casino\n\n{e.Message}" + } |> Async.StartAsTask :> Task + +let sendInitialEmbed (client : DiscordClient) = + async { + try + let! channel = client.GetChannelAsync(961472561319903352uL) |> Async.AwaitTask + let builder = DiscordMessageBuilder() + let embed = DiscordEmbedBuilder() + embed.Title <- "Degenz Slot Machine" + embed.Description <- "Hello I am an embed" + embed.ImageUrl <- "https://i.kym-cdn.com/photos/images/original/001/169/608/a43.gif" + + builder.AddEmbed(embed) |> ignore + + let button = DiscordButtonComponent(ButtonStyle.Success, $"spin", $"Spin Me Right Around") :> DiscordComponent + builder.AddComponents [| button |] |> ignore + do! channel.SendMessageAsync(builder) + |> Async.AwaitTask + |> Async.Ignore + with e -> + printfn $"Error trying to get channel Training Dojo\n\n{e.Message}" + } |> Async.RunSynchronously type SlotMachine() = inherit ApplicationCommandModule () + let enforceChannel (ctx : IDiscordContext) (spinFn : IDiscordContext -> Task) = + match ctx.GetChannel().Id with + | id when id = 961472561319903352uL -> spinFn ctx + | _ -> + task { + let msg = $"You must go to <#961472561319903352> channel to spin" + do! Messaging.sendSimpleResponse ctx msg + } + [] - member this.Spin (ctx : InteractionContext) = - PlayerInteractions.executePlayerAction (DiscordInteractionContext ctx) (fun player -> async { - let sleepTime = 1000 - let random = Random(System.Guid.NewGuid().GetHashCode()) - let results = [ random.Next(0, 3) ; random.Next(0, 3) ; random.Next(0, 3)] - - let winConditions = (results.[0] = results.[1] && results.[0] = results.[2]) - || (results.[0] <> results.[1] && results.[1] <> results.[2] && results.[0] <> results.[2]) - - if winConditions then - do! DbService.updatePlayer { player with Bank = player.Bank + 10 } - |> Async.Ignore - else - do! DbService.updatePlayer { player with Bank = max (player.Bank - 1) 0 } - |> Async.Ignore - - - do! ctx.Interaction.CreateResponseAsync(InteractionResponseType.DeferredChannelMessageWithSource) - |> Async.AwaitTask - - do! Async.Sleep sleepTime - let builder = DiscordFollowupMessageBuilder() - let embed = DiscordEmbedBuilder() - embed.ImageUrl <- slots.[results.[0]] - builder.AddEmbed(embed.Build()) |> ignore - do! ctx.Interaction.CreateFollowupMessageAsync(builder) - |> Async.AwaitTask - |> Async.Ignore - - do! Async.Sleep sleepTime - let builder = DiscordFollowupMessageBuilder() - embed.ImageUrl <- slots.[results.[1]] - builder.AddEmbed(embed.Build()) |> ignore - do! ctx.Interaction.CreateFollowupMessageAsync(builder) - |> Async.AwaitTask - |> Async.Ignore - - do! Async.Sleep sleepTime - let builder = DiscordFollowupMessageBuilder() - embed.ImageUrl <- slots.[results.[2]] - builder.AddEmbed(embed.Build()) |> ignore - do! ctx.Interaction.CreateFollowupMessageAsync(builder) - |> Async.AwaitTask - |> Async.Ignore - - if winConditions then - do! Async.Sleep sleepTime - let builder = DiscordFollowupMessageBuilder() - builder.Content <- "You win 10 GBT!" - do! ctx.Interaction.CreateFollowupMessageAsync(builder) - |> Async.AwaitTask - |> Async.Ignore - else - do! Async.Sleep sleepTime - let builder = DiscordFollowupMessageBuilder() - builder.Content <- "You lose 0.5 GBT! Try your luck again!" - do! ctx.Interaction.CreateFollowupMessageAsync(builder) - |> Async.AwaitTask - |> Async.Ignore - }) + member this.Spin (ctx : InteractionContext) = enforceChannel (DiscordInteractionContext ctx) spinCommand + [] + member this.SpinSimple (ctx : InteractionContext) = enforceChannel (DiscordInteractionContext ctx) spin diff --git a/Bot/GuildEnvironment.fs b/Bot/GuildEnvironment.fs index 6b0d217..3abea24 100644 --- a/Bot/GuildEnvironment.fs +++ b/Bot/GuildEnvironment.fs @@ -22,6 +22,7 @@ let tokenSteal = getVar "TOKEN_STEAL" let tokenHackerBattle = getVar "TOKEN_HACKER_BATTLE" let tokenStore = getVar "TOKEN_STORE" let tokenInviter = getVar "TOKEN_INVITER" +let tokenSlots = getVar "TOKEN_SLOTS" let tokenAdmin = getVar "TOKEN_ADMINBOT" let tokenMixpanel = getVar "TOKEN_MIXPANEL" let channelEventsHackerBattle = getId "CHANNEL_EVENTS_HACKER_BATTLE" diff --git a/Bot/InviteTracker.fs b/Bot/InviteTracker.fs index c8ac2a9..5162bef 100644 --- a/Bot/InviteTracker.fs +++ b/Bot/InviteTracker.fs @@ -301,7 +301,7 @@ let acceptInvite (ctx : IDiscordContext) (invitedPlayer : PlayerData) = let! player = DbService.tryFindPlayer invite.Inviter match player with | Some player -> - do! DbService.updatePlayerCurrency (int InviteRewardAmount) player |> Async.Ignore + do! DbService.updatePlayerCurrency InviteRewardAmount player |> Async.Ignore do! match GuildEnvironment.botClientRecruit with | Some recruitBot -> async { let builder = DiscordMessageBuilder() @@ -341,13 +341,13 @@ Your NFT will be your In-Game Character that provides you with unique traits, an |> Async.AwaitTask |> Async.Ignore with e -> - printfn $"Error trying to get channel Training Dojo\n\n{e.Message}" + printfn $"Error trying to get channel Whitelist\n\n{e.Message}" } |> Async.RunSynchronously type WhitelistResult = | NotInGame | NotAHacker - | NotEnoughGBT of currentAmount : int + | NotEnoughGBT of currentAmount : int | NotEnoughStock | Granted of PlayerData | AlreadyWhitelisted @@ -360,12 +360,12 @@ let tryGrantWhitelist (ctx : IDiscordContext) stock price = let hasWhitelist = Seq.contains (ctx.GetGuild().GetRole(GuildEnvironment.roleWhitelist)) user.Roles let isHacker = Seq.contains (ctx.GetGuild().GetRole(GuildEnvironment.roleHacker)) user.Roles - match hasWhitelist , player.Active , isHacker , stock > 0 , int player.Bank >= price with + match hasWhitelist , player.Active , isHacker , stock > 0 , player.Bank >= price with | true , _ , _ , _ , _ -> return AlreadyWhitelisted | _ , false , _ , _ , _ -> return NotInGame | _ , _ , false , _ , _ -> return NotAHacker | _ , _ , _ , false , _ -> return NotEnoughStock - | _ , _ , _ , _ , false -> return NotEnoughGBT (int player.Bank) + | _ , _ , _ , _ , false -> return NotEnoughGBT player.Bank | _ , _ , _ , _ , _ -> return Granted player | None -> return NotInGame } @@ -505,7 +505,7 @@ let handleBuyWhitelist (ctx : IDiscordContext) = embed.Color <- DiscordColor.Green let recruitBtn = DiscordButtonComponent(ButtonStyle.Danger, $"ShowRecruitmentEmbed", $"Recruit Now") :> DiscordComponent - builder.AddComponents ([ recruitBtn ]) |> ignore + builder.AddComponents [ recruitBtn ] |> ignore let role = ctx.GetGuild().GetRole(GuildEnvironment.roleWhitelist) do! ctx.GetDiscordMember().GrantRoleAsync(role) let! _ = DbService.updatePlayerCurrency -wlItem.Price player diff --git a/Bot/Messaging.fs b/Bot/Messaging.fs index d8298f1..c6511d4 100644 --- a/Bot/Messaging.fs +++ b/Bot/Messaging.fs @@ -23,6 +23,7 @@ type IDiscordContext = abstract member FollowUp : DiscordFollowupMessageBuilder -> Task abstract member GetDiscordMember : unit -> DiscordMember abstract member GetGuild : unit -> DiscordGuild + abstract member GetInteraction : unit -> DiscordInteraction abstract member GetInteractionId : unit -> string abstract member GetChannel : unit -> DiscordChannel abstract member GetContext : unit -> obj @@ -43,6 +44,7 @@ type DiscordInteractionContext(ctx : InteractionContext) = } |> Async.StartAsTask :> Task member this.GetDiscordMember() = ctx.Member member this.GetGuild() = ctx.Guild + member this.GetInteraction() = ctx.Interaction member this.GetInteractionId() = string ctx.InteractionId member this.GetChannel() = ctx.Channel member this.GetContext() = ctx @@ -63,6 +65,7 @@ type DiscordEventContext(ctx : ComponentInteractionCreateEventArgs) = } |> Async.StartAsTask :> Task member this.GetDiscordMember() = ctx.User :?> DiscordMember member this.GetGuild() = ctx.Guild + member this.GetInteraction() = ctx.Interaction member this.GetInteractionId() = ctx.Id member this.GetChannel() = ctx.Channel member this.GetContext() = ctx