diff --git a/Program.fs b/Program.fs index 1cd6604..f049664 100644 --- a/Program.fs +++ b/Program.fs @@ -4,34 +4,43 @@ open DSharpPlus open DSharpPlus.Entities open DSharpPlus.SlashCommands open Emzi0767.Utilities +open LiteDB +open LiteDB.FSharp -type Move = - | Rock - | Paper - | Scissor +type HackType = + | Virus = 0 + | Ransom = 1 + | DDos = 2 + | Worm = 3 + | Crack = 4 -type RoundResult = - | P1Win - | P2Win - | Draw +type DefenseType = + | Firewall + | PortScan + | Encryption + | Cypher + | Hardening -type Player = - { name : string - health : string } - -type Turn = - | WaitingForBoth - | WaitingForOne of Move - | WaitingForTwo of Move - | BothCompleted of Move * Move +[] +type Weapon = { + Id : int + Name : string + Damage : single +} + +type Player = { + Id : int + Name : string + Nickname : string + DiscordId : uint16 + Weapons : int array +} + type Match = - { player1 : DiscordUser - player2 : DiscordUser + { scorePlayer1 : int round : int - scorePlayer1 : int - scorePlayer2 : int - turn : Turn } + scorePlayer2 : int } type JoeBot() = inherit ApplicationCommandModule () @@ -41,15 +50,6 @@ type JoeBot() = [] member _.StartMatch (ctx : InteractionContext, [] player : DiscordUser) = async { - currentMatch <- Some { - player1 = ctx.User - player2 = player - round = 0 - scorePlayer1 = 0 - scorePlayer2 = 0 - turn = WaitingForBoth - } - // We won't be able to find the user if they are Away or Sleeping apparently let ( result , discordMember ) = ctx.Guild.Members.TryGetValue(player.Id) @@ -90,109 +90,20 @@ type JoeBot() = } |> Async.StartAsTask :> Task - [] - member _.SendMove (ctx : InteractionContext, [] moveString : string) = - async { - let move = - match moveString.ToLower() with - | "rock" -> Some Rock - | "paper" -> Some Paper - | "scissors" -> Some Scissor - | _ -> None - - match currentMatch , move with - | Some mtc , Some move -> - let updatedTurn = - match mtc.turn with - | WaitingForBoth -> - match ctx.User with - | mem when mem = mtc.player1 -> WaitingForTwo move - | mem when mem = mtc.player2 -> WaitingForOne move - | _ -> mtc.turn - | WaitingForOne p1m -> - match ctx.User with - | mem when mem = mtc.player1 -> BothCompleted ( p1m , move ) - | mem when mem = mtc.player2 -> mtc.turn - | _ -> mtc.turn - | WaitingForTwo p2m -> - match ctx.User with - | mem when mem = mtc.player1 -> mtc.turn - | mem when mem = mtc.player2 -> BothCompleted ( p2m , move ) - | _ -> mtc.turn - | _ -> mtc.turn - - match updatedTurn with - | BothCompleted ( p1m , p2m ) -> - let result = - match p1m , p2m with - | Rock , Paper -> P2Win - | Rock , Scissor -> P1Win - | Paper , Rock -> P1Win - | Paper , Scissor -> P2Win - | Scissor , Rock -> P2Win - | Scissor , Paper -> P1Win - | _ -> Draw - - match result with - | P1Win | P2Win -> - let winner = match result with P1Win -> mtc.player1 | P2Win -> mtc.player2 | Draw -> mtc.player1 - let winningMove = match result with P1Win -> p1m | P2Win -> p2m | Draw -> p1m - let losingMove = match result with P1Win -> p2m | P2Win -> p1m | Draw -> p1m - let message = $"{winningMove} beats {losingMove}! {winner.Username} takes the round!" - - currentMatch <- Some - { mtc with - round = mtc.round + 1 - scorePlayer1 = mtc.scorePlayer1 + (match result with P1Win -> 1 | _ -> 0) - scorePlayer2 = mtc.scorePlayer2 + (match result with P2Win -> 1 | _ -> 0) - turn = WaitingForBoth - } - if mtc.round >= 3 then - let winnerScore = match result with P1Win -> mtc.scorePlayer1 | P2Win -> mtc.scorePlayer2 | Draw -> 0 - let loserScore = match result with P1Win -> mtc.scorePlayer2 | P2Win -> mtc.scorePlayer1 | Draw -> 0 - - currentMatch <- None - - do! ctx.CreateResponseAsync $"{winner} wins the match {winnerScore} to {loserScore}! Awarding a 100 genz!" - |> Async.AwaitTask - else - do! ctx.CreateResponseAsync message |> Async.AwaitTask - | Draw -> - currentMatch <- Some { mtc with turn = WaitingForBoth } - do! ctx.CreateResponseAsync $"{mtc.player1.Username} and {mtc.player2.Username} both did {p1m}. Round was a draw! Go again!" - |> Async.AwaitTask - | _ -> - if updatedTurn <> mtc.turn then - currentMatch <- Some { mtc with turn = updatedTurn } - let builder = DiscordInteractionResponseBuilder() - do! ctx.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource, builder.WithContent(($"Move received by {ctx.Member.DisplayName}!"))) - |> Async.AwaitTask - else - do! async{ return () } - - | None , _ -> - do! ctx.CreateResponseAsync ("No match has been found, please use the '/start-match' command and mention the two players") - |> Async.AwaitTask - |> Async.Ignore - | _ , None -> - do! ctx.CreateResponseAsync $"Could not recognize move '{moveString}', please try again. Valid moves are 'rock', 'paper', or 'scissor'" - |> Async.AwaitTask - |> Async.Ignore - - } |> Async.StartAsTask - :> Task - - [] - member _.Status (ctx : InteractionContext) = + [] + member _.Hack (ctx : InteractionContext, [] hackType : HackType) = async { let builder = DiscordInteractionResponseBuilder() - builder.IsEphemeral <- true - do! ctx.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource, builder.WithContent(sprintf "%A" currentMatch)) + do! ctx.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource, builder.WithContent(sprintf "%A" hackType)) |> Async.AwaitTask } |> Async.StartAsTask :> Task +let mapper = FSharpBsonMapper() + +let db = new LiteDatabase("hacker-game.db", mapper) + let config = DiscordConfiguration() config.Token <- "OTIyNDIyMDIyMTI1MDEwOTU1.YcBOcw.JxfW1CSIwEO7j6RbRFCnPZ-HoTk" diff --git a/paket.dependencies b/paket.dependencies index 205db6f..c8ca7fc 100644 --- a/paket.dependencies +++ b/paket.dependencies @@ -9,3 +9,6 @@ source https://nuget.emzi0767.com/api/v3/index.json nuget DSharpPlus >= 4.2.0-nightly-01054 nuget DSharpPlus.SlashCommands >= 4.2.0-nightly-01054 + +nuget LiteDB.FSharp 2.16.0 +nuget LiteDB 4.1.4 diff --git a/paket.lock b/paket.lock index 73f1304..f161594 100644 --- a/paket.lock +++ b/paket.lock @@ -22,6 +22,14 @@ NUGET System.Runtime.CompilerServices.Unsafe (>= 5.0) System.ValueTuple (>= 4.5) FSharp.Core (6.0.1) + LiteDB (4.1.4) + System.Reflection (>= 4.3) + System.Reflection.TypeExtensions (>= 4.3) + LiteDB.FSharp (2.16) + FSharp.Core (>= 4.7.2) + LiteDB (>= 4.1.4 < 5.0) + Newtonsoft.Json (>= 13.0.1) + TypeShape (>= 9.0) Microsoft.Bcl.AsyncInterfaces (6.0) - restriction: || (&& (== net6.0) (>= net461)) (&& (== net6.0) (< netstandard2.1)) (== netstandard2.0) (&& (== netstandard2.1) (>= net461)) System.Threading.Tasks.Extensions (>= 4.5.4) - restriction: || (&& (== net6.0) (>= net461)) (&& (== net6.0) (< netstandard2.1)) (== netstandard2.0) (&& (== netstandard2.1) (>= net461)) Microsoft.Extensions.DependencyInjection (6.0) @@ -286,6 +294,9 @@ NUGET System.IO (>= 4.3) System.Reflection.Primitives (>= 4.3) System.Runtime (>= 4.3) + System.Reflection.Emit.ILGeneration (4.7) - restriction: || (&& (== net6.0) (< netcoreapp2.0) (< netstandard2.1)) (&& (== net6.0) (< netstandard2.0)) (&& (== net6.0) (< portable-net45+wp8)) (&& (== net6.0) (>= uap10.1)) (== netstandard2.0) (&& (== netstandard2.1) (< netstandard2.0)) (&& (== netstandard2.1) (< portable-net45+wp8)) (&& (== netstandard2.1) (>= uap10.1)) + System.Reflection.Emit.LightWeight (4.7) - restriction: || (&& (== net6.0) (< netcoreapp3.1)) (== netstandard2.0) (== netstandard2.1) + System.Reflection.Emit.ILGeneration (>= 4.7) - restriction: || (&& (== net6.0) (< netcoreapp2.0) (< netstandard2.1)) (&& (== net6.0) (< netstandard2.0)) (&& (== net6.0) (< portable-net45+wp8)) (&& (== net6.0) (>= uap10.1)) (== netstandard2.0) (&& (== netstandard2.1) (< netstandard2.0)) (&& (== netstandard2.1) (< portable-net45+wp8)) (&& (== netstandard2.1) (>= uap10.1)) System.Reflection.Extensions (4.3) Microsoft.NETCore.Platforms (>= 1.1) Microsoft.NETCore.Targets (>= 1.1) @@ -295,6 +306,7 @@ NUGET Microsoft.NETCore.Platforms (>= 1.1) Microsoft.NETCore.Targets (>= 1.1) System.Runtime (>= 4.3) + System.Reflection.TypeExtensions (4.7) System.Resources.ResourceManager (4.3) Microsoft.NETCore.Platforms (>= 1.1) Microsoft.NETCore.Targets (>= 1.1) @@ -452,3 +464,6 @@ NUGET Microsoft.NETCore.Targets (>= 1.1) System.Runtime (>= 4.3) System.ValueTuple (4.5) + TypeShape (10.0) + FSharp.Core (>= 4.5.4) + System.Reflection.Emit.LightWeight (>= 4.7) - restriction: || (&& (== net6.0) (< netcoreapp3.1)) (== netstandard2.0) (== netstandard2.1) diff --git a/paket.references b/paket.references index a083389..1f488ff 100644 --- a/paket.references +++ b/paket.references @@ -3,3 +3,5 @@ DSharpPlus // DSharpPlus.CommandsNext // DSharpPlus.Interactivity DSharpPlus.SlashCommands +LiteDB +LiteDB.FSharp