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://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" //|] [| "<:sushi:>" "<:pizza:>" "<:ramen:>" "<:circuitboard:>" "<:obey:>" "<:pills:>" "<:oldtv:>" "<:rat:>" "<:aneye:>" "<:anon:>" |] 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 emojis = ctx.GetGuild().Emojis |> Seq.map (fun kvp -> kvp.Value) |> Seq.toArray let! followUp = iCtx.CreateFollowupMessageAsync(builder) |> Async.AwaitTask do! Async.Sleep 1500 let! _ = iCtx.EditFollowupMessageAsync(followUp.Id, DiscordWebhookBuilder().WithContent(Formatter.Emoji(emojis.[results.[0]]))) |> Async.AwaitTask do! Async.Sleep 1500 let! _ = iCtx.EditFollowupMessageAsync(followUp.Id, DiscordWebhookBuilder().WithContent($"{Formatter.Emoji(emojis.[results.[0]])}{Formatter.Emoji(emojis.[results.[1]])}")) |> Async.AwaitTask do! Async.Sleep 1500 let! asdf = iCtx.EditFollowupMessageAsync(followUp.Id, DiscordWebhookBuilder() .WithContent($"{Formatter.Emoji(emojis.[results.[0]])}{Formatter.Emoji(emojis.[results.[1]])}{Formatter.Emoji(emojis.[results.[2]])}") .AddEmbed(embed4) ) |> Async.AwaitTask do! Async.Sleep 1500 let builder = DiscordFollowupMessageBuilder() builder.AddEmbeds([ embed4.Build() ]) |> ignore builder.IsEphemeral <- true // let! _ = iCtx.CreateFollowupMessageAsync(builder) |> Async.AwaitTask return () // 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) = enforceChannel (DiscordInteractionContext ctx) spinCommand [] member this.SpinSimple (ctx : InteractionContext) = enforceChannel (DiscordInteractionContext ctx) spin