diff --git a/PlayerInteractions/Bot.fs b/PlayerInteractions/Bot.fs index cc9d522..e31f5ce 100644 --- a/PlayerInteractions/Bot.fs +++ b/PlayerInteractions/Bot.fs @@ -19,9 +19,10 @@ let playerInteractionsConfig = DiscordConfiguration() let trainerConfig = DiscordConfiguration() let hackerBattleConfig = DiscordConfiguration() let storeConfig = DiscordConfiguration() -let slotMachineConfig = DiscordConfiguration() +//let slotMachineConfig = DiscordConfiguration() -let configs = [| playerInteractionsConfig ; trainerConfig ; hackerBattleConfig ; storeConfig ; slotMachineConfig ; |] +//let configs = [| playerInteractionsConfig ; trainerConfig ; hackerBattleConfig ; storeConfig ; slotMachineConfig ; |] +let configs = [| playerInteractionsConfig ; trainerConfig ; hackerBattleConfig ; storeConfig |] for conf in configs do conf.TokenType <- TokenType.Bot @@ -36,7 +37,7 @@ playerInteractionsConfig.Token <- Environment.GetEnvironmentVariable("BOT_PLAYER trainerConfig.Token <- Environment.GetEnvironmentVariable("BOT_TRAINER") hackerBattleConfig.Token <- Environment.GetEnvironmentVariable("BOT_HACKER_BATTLE") storeConfig.Token <- Environment.GetEnvironmentVariable("BOT_STORE") -slotMachineConfig.Token <- Environment.GetEnvironmentVariable("BOT_SLOT_MACHINE") +//slotMachineConfig.Token <- Environment.GetEnvironmentVariable("BOT_SLOT_MACHINE") //config.MinimumLogLevel <- Microsoft.Extensions.Logging.LogLevel.Trace @@ -44,24 +45,26 @@ let playerInteractionsBot = new DiscordClient(playerInteractionsConfig) let trainerBot = new DiscordClient(trainerConfig) let hackerBattleBot = new DiscordClient(hackerBattleConfig) let storeBot = new DiscordClient(storeConfig) -let slotMachineBot = new DiscordClient(slotMachineConfig) +//let slotMachineBot = new DiscordClient(slotMachineConfig) hackerBattleBot.add_ComponentInteractionCreated(AsyncEventHandler(HackerBattle.handleButtonEvent)) trainerBot.add_ComponentInteractionCreated(AsyncEventHandler(Trainer.handleButtonEvent)) +storeBot.add_ComponentInteractionCreated(AsyncEventHandler(Store.handleSellButtonEvents)) -let clients = [| playerInteractionsBot ; trainerBot ; hackerBattleBot ; storeBot ; slotMachineBot |] +//let clients = [| storeBot ; trainerBot ; hackerBattleBot ; playerInteractionsBot ; slotMachineBot |] +let clients = [| storeBot ; trainerBot ; hackerBattleBot ; playerInteractionsBot |] let sc1 = playerInteractionsBot.UseSlashCommands() let sc2 = trainerBot.UseSlashCommands() let sc3 = hackerBattleBot.UseSlashCommands() let sc4 = storeBot.UseSlashCommands() -let sc5 = slotMachineBot.UseSlashCommands() +//let sc5 = slotMachineBot.UseSlashCommands() sc1.RegisterCommands(guild); sc2.RegisterCommands(guild); sc3.RegisterCommands(guild); sc4.RegisterCommands(guild); -sc5.RegisterCommands(guild); +//sc5.RegisterCommands(guild); let run (client : DiscordClient) = async { diff --git a/PlayerInteractions/HackerBattle.fs b/PlayerInteractions/HackerBattle.fs index 36421c9..25ed59b 100644 --- a/PlayerInteractions/HackerBattle.fs +++ b/PlayerInteractions/HackerBattle.fs @@ -27,8 +27,13 @@ let attack (ctx : InteractionContext) (target : DiscordUser) = |> removeExpiredActions (TimeSpan.FromMinutes(15)) (fun (atk : Attack) -> atk.Timestamp) do! DbService.updatePlayer <| { attacker with Attacks = updatedAttacks } if updatedAttacks.Length < 2 then + let embed = DiscordEmbedBuilder() + embed.Color <- Optional(DiscordColor.PhthaloGreen) + embed.Description <- "Pick the hack that you want to use" + embed.ImageUrl <- "https://s10.gifyu.com/images/Hacker-Degenz-V2.gif" + let builder = DiscordInteractionResponseBuilder() - builder.AddEmbed (constructEmbed "Pick the hack you wish to use.") |> ignore + builder.AddEmbed (embed.Build()) |> ignore let defenderInfo = $"{defender.DiscordId}-{target.Username}" constructButtons "Attack" defenderInfo attacker.Weapons @@ -94,10 +99,10 @@ let defend (ctx : InteractionContext) = let handleAttack (event : ComponentInteractionCreateEventArgs) = let updatePlayer amount attack p = - { p with Attacks = Array.append [| attack |] p.Attacks ; Bank = MathF.Max(p.Bank + amount, 0f) } + { p with Attacks = Array.append [| attack |] p.Attacks ; Bank = Math.Max(p.Bank + amount, 0) } async { let split = event.Id.Split("-") - let weapon = Enum.Parse(typedefof, split.[1]) :?> Weapon + let weapon = Enum.Parse(typedefof, split.[1]) :?> Hack let ( resultId , targetId ) = UInt64.TryParse split.[2] let! resultPlayer = DbService.tryFindPlayer event.User.Id let! resultTarget = DbService.tryFindPlayer targetId @@ -114,7 +119,7 @@ let handleAttack (event : ComponentInteractionCreateEventArgs) = match wasSuccessfulHack with | false -> let prize = 1.337f // LEET - let attack = { HackType = enum(int weapon) ; Timestamp = DateTime.UtcNow ; Target = { Id = targetId ; Name = split.[3] } } + let attack = { HackType = enum(int weapon) ; Timestamp = DateTime.UtcNow ; Target = { Id = targetId ; Name = split.[3] } } // TODO: Make a single update instead of two do! DbService.updatePlayer <| updatePlayer prize attack player do! DbService.updatePlayer { target with Bank = MathF.Max(target.Bank - prize, 0f)} @@ -139,7 +144,7 @@ let handleAttack (event : ComponentInteractionCreateEventArgs) = do! event.Interaction.CreateResponseAsync(InteractionResponseType.UpdateMessage, builder) |> Async.AwaitTask - let attack = { HackType = enum(int weapon) ; Timestamp = DateTime.UtcNow ; Target = { Id = targetId ; Name = split.[3] } } + let attack = { HackType = enum(int weapon) ; Timestamp = DateTime.UtcNow ; Target = { Id = targetId ; Name = split.[3] } } do! DbService.updatePlayer <| updatePlayer -prize attack player do! DbService.updatePlayer { target with Bank = target.Bank + prize } diff --git a/PlayerInteractions/Items.json b/PlayerInteractions/Items.json index 17cb719..a197a47 100644 --- a/PlayerInteractions/Items.json +++ b/PlayerInteractions/Items.json @@ -1,32 +1,32 @@ [ { "Name" : "Virus", - "ItemType" : { "Case" : "Weapon" }, + "ItemType" : { "Case" : "Hack" }, "Cost" : 5.0 }, { "Name" : "Ransom", - "ItemType" : { "Case" : "Weapon" }, + "ItemType" : { "Case" : "Hack" }, "Cost" : 10.0 }, { "Name" : "Worm", - "ItemType" : { "Case" : "Weapon" }, + "ItemType" : { "Case" : "Hack" }, "Cost" : 5.0 }, { "Name" : "DDos", - "ItemType" : { "Case" : "Weapon" }, + "ItemType" : { "Case" : "Hack" }, "Cost" : 10.0 }, { "Name" : "Crack", - "ItemType" : { "Case" : "Weapon" }, + "ItemType" : { "Case" : "Hack" }, "Cost" : 5.0 }, { "Name" : "Injection", - "ItemType" : { "Case" : "Weapon" }, + "ItemType" : { "Case" : "Hack" }, "Cost" : 10.0 }, { @@ -39,24 +39,24 @@ "ItemType" : { "Case" : "Shield" }, "Cost" : 10.0 }, + { + "Name" : "Cypher", + "ItemType" : { "Case" : "Shield" }, + "Cost" : 5.0 + }, { "Name" : "Encryption", "ItemType" : { "Case" : "Shield" }, + "Cost" : 10.0 + }, + { + "Name" : "Sanitation", + "ItemType" : { "Case" : "Shield" }, "Cost" : 5.0 }, { "Name" : "Hardening", "ItemType" : { "Case" : "Shield" }, "Cost" : 10.0 - }, - { - "Name" : "Cypher", - "ItemType" : { "Case" : "Shield" }, - "Cost" : 5.0 - }, - { - "Name" : "Sanitation", - "ItemType" : { "Case" : "Shield" }, - "Cost" : 10.0 } ] diff --git a/PlayerInteractions/PlayerInteractions.fs b/PlayerInteractions/PlayerInteractions.fs index 00d1ad9..154ec61 100644 --- a/PlayerInteractions/PlayerInteractions.fs +++ b/PlayerInteractions/PlayerInteractions.fs @@ -75,6 +75,13 @@ module Commands = } |> Async.StartAsTask :> Task + [] + type LeaderboardEntry = { + Position : string + Amount : string + Name : string + } + let leaderboard (ctx : InteractionContext) = async { let builder = DiscordInteractionResponseBuilder() @@ -82,12 +89,12 @@ module Commands = let! leaders = DbService.getTopPlayers 10 let content = - // TODO: There's a bug, it's not in the right order leaders |> Seq.toArray - |> Array.mapi (fun i p -> $"{i + 1}. {p.Bank} {p.Name}") - |> String.concat "\n" - builder.Content <- if not <| String.IsNullOrEmpty content then content else "There are no active hackers" + |> Array.sortByDescending (fun p -> p.Bank) + |> Array.mapi (fun i p -> { Position = string (i + 1) ; Amount = string p.Bank ; Name = p.Name }) + |> Formatter.Format + builder.Content <- if not <| String.IsNullOrEmpty content then $"```{content}```" else "There are no active hackers" do! ctx.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource, builder) |> Async.AwaitTask } |> Async.StartAsTask diff --git a/PlayerInteractions/Store.fs b/PlayerInteractions/Store.fs index 616a475..944c7a6 100644 --- a/PlayerInteractions/Store.fs +++ b/PlayerInteractions/Store.fs @@ -8,6 +8,7 @@ open DSharpPlus.SlashCommands open Degenz open Degenz.Shared open Newtonsoft.Json +open AsciiTableFormatter let store = try @@ -16,180 +17,209 @@ let store = |> Array.groupBy (fun (i : Item) -> i.ItemType) with _ -> [||] +//[] +//type Table() = +// member val Name = "" with get , set +// member val Cost = "" with get , set +// member val Class = "" with get , set +// + +[] +type Table = { + Name : string + Cost : string + Class : string +} + + let storeListing = store |> Array.map (fun ( itemType , items ) -> - let itemList = items |> Array.map (fun i -> $"{i.Name} - {i.Cost} GBT") |> String.concat "\n" - (constructEmbed $"{itemType}:\n{itemList}")) + let itemsData = + items + |> Array.map (fun (item : Item) -> + let itemClass = + if itemType = ItemType.Hack + then weaponInventory + |> Array.find (fun w -> item.Name = string w) + |> int + |> getClass + else shieldInventory + |> Array.find (fun w -> item.Name = string w) + |> int + |> getClass + { Name = item.Name ; Cost = string item.Cost ; Class = string itemClass }) -module Commands = - let viewStore (ctx : InteractionContext) = - async { - let builder = DiscordInteractionResponseBuilder() + let table = Formatter.Format(ResizeArray(itemsData)) - builder.AddEmbeds(storeListing) - .AsEphemeral(true) - |> ignore + (constructEmbed $"**{itemType}s**\n```{table}```")) - do! ctx.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource, builder) - |> Async.AwaitTask - } |> Async.StartAsTask - :> Task +let viewStore (ctx : InteractionContext) = + async { + let builder = DiscordInteractionResponseBuilder() - let getItems itemType = store |> Array.find (fun ( t , _ ) -> t = itemType) |> snd + builder.AddEmbeds(storeListing) + .AsEphemeral(true) + |> ignore - let buyHack (ctx : InteractionContext) hackId = - async { - let! playerResult = DbService.tryFindPlayer ctx.Member.Id - let weapons = getItems ItemType.Weapon - let weaponResult = weapons |> Array.tryFind (fun w -> w.Name = string hackId) - return! - match playerResult , weaponResult with - | Some player , Some item -> - async { - let newBalance = player.Bank - item.Cost - if newBalance >= 0.0f then - let playerHasItem = player.Weapons |> Array.exists (fun w -> item.Name = string w) - if not playerHasItem then - let weapon = weaponInventory |> Array.find (fun w -> item.Name = string w) - let p = { player with Bank = newBalance ; Weapons = Array.append [| weapon |] player.Weapons } - do! DbService.updatePlayer p - do! createSimpleResponseAsync $"Successfully purchased {item.Name}! You now have {newBalance} remaining" ctx - else - do! createSimpleResponseAsync $"You already own this item!" ctx + do! ctx.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource, builder) + |> Async.AwaitTask + } |> Async.StartAsTask + :> Task + +let getItems itemType = store |> Array.find (fun ( t , _ ) -> t = itemType) |> snd + +let buyHack (ctx : InteractionContext) hackId = + async { + let! playerResult = DbService.tryFindPlayer ctx.Member.Id + let weapons = getItems ItemType.Hack + let weaponResult = weapons |> Array.tryFind (fun w -> w.Name = string hackId) + return! + match playerResult , weaponResult with + | Some player , Some item -> + async { + let newBalance = player.Bank - item.Cost + if newBalance >= 0 then + let playerHasItem = player.Weapons |> Array.exists (fun w -> item.Name = string w) + if not playerHasItem then + let weapon = weaponInventory |> Array.find (fun w -> item.Name = string w) + let p = { player with Bank = newBalance ; Weapons = Array.append [| weapon |] player.Weapons } + do! DbService.updatePlayer p + do! createSimpleResponseAsync $"Successfully purchased {item.Name}! You now have {newBalance} remaining" ctx else - do! createSimpleResponseAsync $"You do not have sufficient funds to buy this item! Current balance: {player.Bank} GBT" ctx - } - | None , _ -> notYetAHackerMsg ctx - | _ -> createSimpleResponseAsync "Something is wrong" ctx - } |> Async.StartAsTask - :> Task + do! createSimpleResponseAsync $"You already own this item!" ctx + else + do! createSimpleResponseAsync $"You do not have sufficient funds to buy this item! Current balance: {player.Bank} GBT" ctx + } + | None , _ -> notYetAHackerMsg ctx + | _ -> createSimpleResponseAsync "Something is wrong" ctx + } |> Async.StartAsTask + :> Task - let buyShield (ctx : InteractionContext) shieldId = - async { - let! playerResult = DbService.tryFindPlayer ctx.Member.Id - let shieldResult = - getItems ItemType.Shield - |> Array.tryFind (fun w -> w.Name = string shieldId) - return! - match playerResult , shieldResult with - | Some player , Some item -> - async { - let newBalance = player.Bank - item.Cost - if newBalance >= 0.0f then - let playerHasItem = player.Shields |> Array.exists (fun w -> item.Name = string w) - if not playerHasItem then - let shield = shieldInventory |> Array.find (fun w -> item.Name = string w) - let p = { player with Bank = newBalance ; Shields = Array.append [| shield |] player.Shields } - do! DbService.updatePlayer p - do! createSimpleResponseAsync $"Successfully purchased {item.Name}! You now have {newBalance} remaining" ctx - else - do! createSimpleResponseAsync $"You already own this item!" ctx +let buyShield (ctx : InteractionContext) shieldId = + async { + let! playerResult = DbService.tryFindPlayer ctx.Member.Id + let shieldResult = + getItems ItemType.Shield + |> Array.tryFind (fun w -> w.Name = string shieldId) + return! + match playerResult , shieldResult with + | Some player , Some item -> + async { + let newBalance = player.Bank - item.Cost + if newBalance >= 0 then + let playerHasItem = player.Shields |> Array.exists (fun w -> item.Name = string w) + if not playerHasItem then + let shield = shieldInventory |> Array.find (fun w -> item.Name = string w) + let p = { player with Bank = newBalance ; Shields = Array.append [| shield |] player.Shields } + do! DbService.updatePlayer p + do! createSimpleResponseAsync $"Successfully purchased {item.Name}! You now have {newBalance} remaining" ctx else - do! createSimpleResponseAsync $"You do not have sufficient funds to buy this item! Current balance: {player.Bank} GBT" ctx - } - | None , _ -> notYetAHackerMsg ctx - | _ -> createSimpleResponseAsync "Something is wrong" ctx - } |> Async.StartAsTask - :> Task + do! createSimpleResponseAsync $"You already own this item!" ctx + else + do! createSimpleResponseAsync $"You do not have sufficient funds to buy this item! Current balance: {player.Bank} GBT" ctx + } + | None , _ -> notYetAHackerMsg ctx + | _ -> createSimpleResponseAsync "Something is wrong" ctx + } |> Async.StartAsTask + :> Task - let constructItemButtons playerInfo itemType (items : 'a array) = - items - |> Seq.map (fun item -> DiscordButtonComponent(ButtonStyle.Primary, $"{playerInfo}-{itemType}-{item}", $"{item}")) +let constructItemButtons playerInfo itemType (items : 'a array) = + items + |> Seq.map (fun item -> DiscordButtonComponent(ButtonStyle.Primary, $"{playerInfo}-{itemType}-{item}", $"{item}")) - let sellItem (ctx : InteractionContext) = - async { - let! playerResult = DbService.tryFindPlayer ctx.Member.Id - match playerResult with - | Some player -> - let hasInventoryToSell = Array.length player.Weapons + Array.length player.Shields > 0 - if hasInventoryToSell then - let builder = DiscordInteractionResponseBuilder() - builder.AddEmbed (constructEmbed "Pick the item you wish to sell.") |> ignore +let sellItem (ctx : InteractionContext) = + async { + let! playerResult = DbService.tryFindPlayer ctx.Member.Id + match playerResult with + | Some player -> + let hasInventoryToSell = Array.length player.Weapons + Array.length player.Shields > 0 + if hasInventoryToSell then + let builder = DiscordInteractionResponseBuilder() + builder.AddEmbed (constructEmbed "Pick the item you wish to sell.") |> ignore - Array.chunkBySize 3 player.Weapons - |> Array.iter - (fun wps -> - wps - |> Array.map (fun w -> DiscordButtonComponent(ButtonStyle.Primary, $"Weapon-{w}", $"{w}")) - |> Seq.cast - |> builder.AddComponents - |> ignore) - Array.chunkBySize 3 player.Shields - |> Array.iter - (fun shs -> - shs - |> Array.map (fun s -> DiscordButtonComponent(ButtonStyle.Primary, $"Shield-{s}", $"{s}")) - |> Seq.cast - |> builder.AddComponents - |> ignore) + Array.chunkBySize 3 player.Weapons + |> Array.iter + (fun wps -> + wps + |> Array.map (fun w -> DiscordButtonComponent(ButtonStyle.Primary, $"Hack-{w}", $"{w}")) + |> Seq.cast + |> builder.AddComponents + |> ignore) + Array.chunkBySize 3 player.Shields + |> Array.iter + (fun shs -> + shs + |> Array.map (fun s -> DiscordButtonComponent(ButtonStyle.Primary, $"Shield-{s}", $"{s}")) + |> Seq.cast + |> builder.AddComponents + |> ignore) - builder.AsEphemeral true |> ignore + builder.AsEphemeral true |> ignore - do! ctx.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource, builder) - |> Async.AwaitTask - else - do! createSimpleResponseAsync "You currently have no inventory to sell" ctx - | None -> do! notYetAHackerMsg ctx - return () - } |> Async.StartAsTask - :> Task + do! ctx.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource, builder) + |> Async.AwaitTask + else + do! createSimpleResponseAsync "You currently have no inventory to sell" ctx + | None -> do! notYetAHackerMsg ctx + return () + } |> Async.StartAsTask + :> Task - let handleSellButtonEvents (_ : DiscordClient) (event : ComponentInteractionCreateEventArgs) = - async { - let! playerResult = DbService.tryFindPlayer event.User.Id - match playerResult with - | Some player -> - let split = event.Id.Split("-") - let itemType = match split.[0] with "Weapon" -> ItemType.Weapon | _ -> ItemType.Shield - let itemName = split.[1] - match itemType with - | ItemType.Weapon -> - let item = getItems ItemType.Weapon |> Array.find (fun w -> w.Name = itemName) - let salePrice = item.Cost / 2.f - let updatedWeapons = player.Weapons |> Array.filter (fun (w : Weapon) -> string w <> itemName) - let updatedPlayer = { player with Bank = player.Bank + salePrice ; Weapons = updatedWeapons } - do! DbService.updatePlayer updatedPlayer - let builder = DiscordInteractionResponseBuilder() - builder.IsEphemeral <- true - builder.Content <- $"Sold weapon {itemName} for {salePrice}! Current Balance: {updatedPlayer.Bank}" - do! event.Interaction.CreateResponseAsync(InteractionResponseType.UpdateMessage, builder) - |> Async.AwaitTask - | ItemType.Shield -> - let item = getItems ItemType.Shield |> Array.find (fun s -> s.Name = itemName) - let salePrice = item.Cost / 2.f - let updatedShields = player.Shields |> Array.filter (fun (s : Shield) -> string s <> itemName) - let updatedPlayer = { player with Bank = player.Bank + salePrice ; Shields = updatedShields } - do! DbService.updatePlayer updatedPlayer - let builder = DiscordInteractionResponseBuilder() - builder.IsEphemeral <- true - builder.Content <- $"Sold shield {itemName} for {salePrice}! Current Balance: {updatedPlayer.Bank}" - do! event.Interaction.CreateResponseAsync(InteractionResponseType.UpdateMessage, builder) - |> Async.AwaitTask - | None -> +let handleSellButtonEvents (_ : DiscordClient) (event : ComponentInteractionCreateEventArgs) = + async { + let! playerResult = DbService.tryFindPlayer event.User.Id + match playerResult with + | Some player -> + let split = event.Id.Split("-") + let itemType = match split.[0] with "Hack" -> ItemType.Hack | _ -> ItemType.Shield + let itemName = split.[1] + match itemType with + | ItemType.Hack -> + let item = getItems ItemType.Hack |> Array.find (fun w -> w.Name = itemName) + let salePrice = item.Cost / 2 + let updatedWeapons = player.Weapons |> Array.filter (fun (w : Hack) -> string w <> itemName) + let updatedPlayer = { player with Bank = player.Bank + salePrice ; Weapons = updatedWeapons } + do! DbService.updatePlayer updatedPlayer let builder = DiscordInteractionResponseBuilder() builder.IsEphemeral <- true - builder.Content <- "An error occurred and the user doesn't not exist" + builder.Content <- $"Sold hack {itemName} for {salePrice}! Current Balance: {updatedPlayer.Bank}" do! event.Interaction.CreateResponseAsync(InteractionResponseType.UpdateMessage, builder) |> Async.AwaitTask - } |> Async.StartAsTask - :> Task + | ItemType.Shield -> + let item = getItems ItemType.Shield |> Array.find (fun s -> s.Name = itemName) + let salePrice = item.Cost / 2 + let updatedShields = player.Shields |> Array.filter (fun (s : Shield) -> string s <> itemName) + let updatedPlayer = { player with Bank = player.Bank + salePrice ; Shields = updatedShields } + do! DbService.updatePlayer updatedPlayer + let builder = DiscordInteractionResponseBuilder() + builder.IsEphemeral <- true + builder.Content <- $"Sold shield {itemName} for {salePrice}! Current Balance: {updatedPlayer.Bank}" + do! event.Interaction.CreateResponseAsync(InteractionResponseType.UpdateMessage, builder) + |> Async.AwaitTask + | None -> + let builder = DiscordInteractionResponseBuilder() + builder.IsEphemeral <- true + builder.Content <- "An error occurred and the user doesn't not exist" + do! event.Interaction.CreateResponseAsync(InteractionResponseType.UpdateMessage, builder) + |> Async.AwaitTask + } |> Async.StartAsTask + :> Task type Store() = inherit ApplicationCommandModule () [] - member _.ViewStore (ctx : InteractionContext) = Commands.viewStore ctx + member _.ViewStore (ctx : InteractionContext) = viewStore ctx [] - member _.BuyHack (ctx : InteractionContext, [] hackId : Weapon) = - Commands.buyHack ctx hackId + member _.BuyHack (ctx : InteractionContext, [] hackId : Hack) = + buyHack ctx hackId [] member this.BuyShield (ctx : InteractionContext, [] shieldId : Shield) = - Commands.buyShield ctx shieldId + buyShield ctx shieldId [] - member this.SellItem (ctx : InteractionContext) = - Commands.sellItem ctx + member this.SellItem (ctx : InteractionContext) = sellItem ctx diff --git a/PlayerInteractions/paket.references b/PlayerInteractions/paket.references index 9caa48b..30cc93a 100644 --- a/PlayerInteractions/paket.references +++ b/PlayerInteractions/paket.references @@ -2,3 +2,4 @@ FSharp.Core DSharpPlus DSharpPlus.SlashCommands dotenv.net +DanielStout.AsciiTableFormatter diff --git a/Shared/Shared.fs b/Shared/Shared.fs index 0e10305..4413a44 100644 --- a/Shared/Shared.fs +++ b/Shared/Shared.fs @@ -6,7 +6,7 @@ open DSharpPlus.Entities open DSharpPlus.SlashCommands type ItemType = - | Weapon + | Hack | Shield type ActionClass = @@ -14,7 +14,7 @@ type ActionClass = | Exploit | Penetration -type Weapon = +type Hack = | Virus = 0 | Ransom = 1 | Worm = 2 @@ -34,20 +34,17 @@ type Shield = type Item = { Name : string ItemType : ItemType - Cost : single + Cost : int } -let weaponInventory = [| Weapon.Virus ; Weapon.Ransom ; Weapon.DDos ; Weapon.Worm ; Weapon.Crack ; Weapon.Injection |] +let weaponInventory = [| Hack.Virus ; Hack.Ransom ; Hack.DDos ; Hack.Worm ; Hack.Crack ; Hack.Injection |] let shieldInventory = [| Shield.Firewall ; Shield.PortScan ; Shield.Encryption ; Shield.Cypher ; Shield.Hardening ; Shield.Sanitation |] let getClass = function - | 0 - | 1 -> Network - | 2 - | 3 -> Exploit - | 4 - | _ -> Penetration + | 0 | 1 -> Network + | 2 | 3 -> Exploit + | 4 | _ -> Penetration type HackResult = | Strong @@ -58,7 +55,7 @@ type DiscordPlayer = { Id: uint64; Name: string } [] type Attack = - { HackType: Weapon + { HackType: Hack Target: DiscordPlayer Timestamp: DateTime } @@ -71,11 +68,11 @@ type Defense = type Player = { DiscordId: uint64 Name: string - Weapons: Weapon array + Weapons: Hack array Shields: Shield array Attacks: Attack array Defenses: Defense array - Bank: single } + Bank: int } let createSimpleResponseAsync msg (ctx: InteractionContext) = diff --git a/paket.dependencies b/paket.dependencies index 535425c..7e2db8e 100644 --- a/paket.dependencies +++ b/paket.dependencies @@ -13,3 +13,5 @@ nuget DSharpPlus.SlashCommands >= 4.2.0-nightly-01061 nuget MongoDB.Driver nuget dotenv.net 3.1.1 + +nuget DanielStout.AsciiTableFormatter diff --git a/paket.lock b/paket.lock index f0c8b76..0b5bc5a 100644 --- a/paket.lock +++ b/paket.lock @@ -2,6 +2,7 @@ STORAGE: NONE RESTRICTION: || (== net6.0) (== netstandard2.0) (== netstandard2.1) NUGET remote: https://api.nuget.org/v3/index.json + DanielStout.AsciiTableFormatter (1.1) DnsClient (1.5) Microsoft.Win32.Registry (>= 5.0) System.Buffers (>= 4.5.1) - restriction: || (&& (== net6.0) (>= net471)) (&& (== net6.0) (< netstandard2.0)) (&& (== net6.0) (< netstandard2.1)) (== netstandard2.0) (&& (== netstandard2.1) (>= net471)) (&& (== netstandard2.1) (< netstandard2.0))