WIP Compiler Errors: Adding DbService and PlayerRegistration components
This commit is contained in:
		
							parent
							
								
									e40fc42482
								
							
						
					
					
						commit
						7b2f6ba861
					
				
							
								
								
									
										39
									
								
								DbService/DbService.fs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								DbService/DbService.fs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,39 @@ | |||||||
|  | module DegenzGame.DbService | ||||||
|  | 
 | ||||||
|  | open DegenzGame.Shared | ||||||
|  | open DegenzGame.Shared | ||||||
|  | open MongoDB.Bson | ||||||
|  | open MongoDB.Driver | ||||||
|  | 
 | ||||||
|  | type PlayerEntry = { | ||||||
|  |     Id : BsonObjectId | ||||||
|  |     Player : Player | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | let mongo = MongoClient("mongodb://localhost:27017") | ||||||
|  | let db = mongo.GetDatabase("degenz-game") | ||||||
|  | let players = db.GetCollection<PlayerEntry>("players") | ||||||
|  | 
 | ||||||
|  | let tryFindPlayer (id : uint64) : Async<Player option> = | ||||||
|  |     async { | ||||||
|  |         let filter = Builders<PlayerEntry>.Filter.Eq((fun p -> p.Player.DiscordId), id) | ||||||
|  |         let! player = players.FindAsync<PlayerEntry>(filter) |> Async.AwaitTask | ||||||
|  |         return match player.ToEnumerable() |> Seq.toList with | ||||||
|  |                | []  -> None | ||||||
|  |                | entry::_ -> Some entry.Player | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | let insertNewPlayer (player : Player) = | ||||||
|  |     async { | ||||||
|  |         do! { Id = BsonObjectId(ObjectId.GenerateNewId()) ; Player = player } | ||||||
|  |             |> players.InsertOneAsync | ||||||
|  |             |> Async.AwaitTask | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | let removePlayer (memberId : uint64) = | ||||||
|  |     async { | ||||||
|  |         // TODO: Check the result of this delete operation | ||||||
|  |         return! players.DeleteOneAsync (fun p -> p.Player.DiscordId = memberId) | ||||||
|  |                 |> Async.AwaitTask | ||||||
|  |                 |> Async.Ignore | ||||||
|  |     } | ||||||
							
								
								
									
										14
									
								
								DbService/DbService.fsproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								DbService/DbService.fsproj
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net6.0</TargetFramework> | ||||||
|  |     <GenerateDocumentationFile>true</GenerateDocumentationFile> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <Compile Include="DbService.fs" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="..\Shared\Shared.fsproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <Import Project="..\.paket\Paket.Restore.targets" /> | ||||||
|  | </Project> | ||||||
							
								
								
									
										7
									
								
								DbService/paket.references
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								DbService/paket.references
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | |||||||
|  | FSharp.Core | ||||||
|  | DSharpPlus | ||||||
|  | // DSharpPlus.CommandsNext | ||||||
|  | // DSharpPlus.Interactivity | ||||||
|  | DSharpPlus.SlashCommands | ||||||
|  | 
 | ||||||
|  | MongoDB.Driver | ||||||
| @ -9,6 +9,10 @@ Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Shared", "Shared\Shared.fsp | |||||||
| EndProject | EndProject | ||||||
| Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Store", "Store\Store.fsproj", "{CD88B0A6-DE42-4087-9B33-48FF84201633}" | Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Store", "Store\Store.fsproj", "{CD88B0A6-DE42-4087-9B33-48FF84201633}" | ||||||
| EndProject | EndProject | ||||||
|  | Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "PlayerRegistration", "PlayerRegistration\PlayerRegistration.fsproj", "{FF9E58A6-1A1D-4DEC-B52D-265F215BF315}" | ||||||
|  | EndProject | ||||||
|  | Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "DbService", "DbService\DbService.fsproj", "{B1D3E1CC-451C-42D4-B054-D64E75E1A3B9}" | ||||||
|  | EndProject | ||||||
| Global | Global | ||||||
| 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||||
| 		Debug|Any CPU = Debug|Any CPU | 		Debug|Any CPU = Debug|Any CPU | ||||||
| @ -30,5 +34,13 @@ Global | |||||||
| 		{CD88B0A6-DE42-4087-9B33-48FF84201633}.Debug|Any CPU.Build.0 = Debug|Any CPU | 		{CD88B0A6-DE42-4087-9B33-48FF84201633}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
| 		{CD88B0A6-DE42-4087-9B33-48FF84201633}.Release|Any CPU.ActiveCfg = Release|Any CPU | 		{CD88B0A6-DE42-4087-9B33-48FF84201633}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
| 		{CD88B0A6-DE42-4087-9B33-48FF84201633}.Release|Any CPU.Build.0 = Release|Any CPU | 		{CD88B0A6-DE42-4087-9B33-48FF84201633}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{FF9E58A6-1A1D-4DEC-B52D-265F215BF315}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{FF9E58A6-1A1D-4DEC-B52D-265F215BF315}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{FF9E58A6-1A1D-4DEC-B52D-265F215BF315}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{FF9E58A6-1A1D-4DEC-B52D-265F215BF315}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{B1D3E1CC-451C-42D4-B054-D64E75E1A3B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{B1D3E1CC-451C-42D4-B054-D64E75E1A3B9}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{B1D3E1CC-451C-42D4-B054-D64E75E1A3B9}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{B1D3E1CC-451C-42D4-B054-D64E75E1A3B9}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
| 	EndGlobalSection | 	EndGlobalSection | ||||||
| EndGlobal | EndGlobal | ||||||
| @ -6,7 +6,8 @@ open DSharpPlus | |||||||
| open DSharpPlus.Entities | open DSharpPlus.Entities | ||||||
| open DSharpPlus.EventArgs | open DSharpPlus.EventArgs | ||||||
| open DSharpPlus.SlashCommands | open DSharpPlus.SlashCommands | ||||||
| open DegenzGame.Types | open DegenzGame.Shared | ||||||
|  | open DegenzGame.DbService | ||||||
| open DegenzGame.Functions | open DegenzGame.Functions | ||||||
| open MongoDB.Driver | open MongoDB.Driver | ||||||
| 
 | 
 | ||||||
| @ -16,60 +17,6 @@ open MongoDB.Driver | |||||||
| // My server | // My server | ||||||
| let battleChannel = 927449884204867664uL | let battleChannel = 927449884204867664uL | ||||||
| 
 | 
 | ||||||
| let mongo = MongoClient("mongodb://localhost:27017") |  | ||||||
| let db = mongo.GetDatabase("degenz-game") |  | ||||||
| let players = db.GetCollection<Player>("players") |  | ||||||
| 
 |  | ||||||
| let tryFindPlayer (id : uint64) : Async<Player option> = |  | ||||||
|     async { |  | ||||||
|         let filter = Builders<Player>.Filter.Eq((fun p -> p.DiscordId), id) |  | ||||||
|         let! player = players.FindAsync<Player>(filter) |> Async.AwaitTask |  | ||||||
|         return match player.ToEnumerable() |> Seq.toList with |  | ||||||
|                | []  -> None |  | ||||||
|                | p::_ -> Some p |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
| let addHackerRole (ctx : InteractionContext) = |  | ||||||
|     async { |  | ||||||
|         let! player = tryFindPlayer ctx.Member.Id |  | ||||||
|         let! newPlayer = |  | ||||||
|             match player with |  | ||||||
|             | Some _ -> async.Return false |  | ||||||
|             | None -> |  | ||||||
|                 async { |  | ||||||
|                     let p = (newPlayer ctx.Member.Username ctx.Member.Id) |  | ||||||
|                     do! players.InsertOneAsync p |> Async.AwaitTask |  | ||||||
| 
 |  | ||||||
|                     for role in ctx.Guild.Roles do |  | ||||||
|                         if role.Value.Name = "Hacker" then |  | ||||||
|                             do! ctx.Member.GrantRoleAsync(role.Value) |  | ||||||
|                                 |> Async.AwaitTask |  | ||||||
| 
 |  | ||||||
|                     return true |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|         if newPlayer then |  | ||||||
|             do! ctx.CreateResponseAsync("You are now an elite haxxor", true) |  | ||||||
|                 |> Async.AwaitTask |  | ||||||
|         else |  | ||||||
|             do! ctx.CreateResponseAsync("Already registered as an elite haxxor", true) |  | ||||||
|                 |> Async.AwaitTask |  | ||||||
| 
 |  | ||||||
|     } |> Async.StartAsTask |  | ||||||
|     :> Task |  | ||||||
| 
 |  | ||||||
| let removeHackerRole (ctx : InteractionContext) = |  | ||||||
|     async { |  | ||||||
|         for role in ctx.Member.Roles do |  | ||||||
|             if role.Name = "Hacker" then |  | ||||||
|                 do! ctx.Member.RevokeRoleAsync(role) |  | ||||||
|                     |> Async.AwaitTask |  | ||||||
|         // TODO: Check the result of this delete operation |  | ||||||
|         let! _ = players.DeleteOneAsync (fun p -> p.DiscordId = ctx.Member.Id) |> Async.AwaitTask |  | ||||||
|         do! ctx.CreateResponseAsync("You are now lame", true) |  | ||||||
|             |> Async.AwaitTask |  | ||||||
|     } |> Async.StartAsTask |  | ||||||
|     :> Task |  | ||||||
| 
 | 
 | ||||||
| let attack (ctx : InteractionContext) (target : DiscordUser) = | let attack (ctx : InteractionContext) (target : DiscordUser) = | ||||||
|     async { |     async { | ||||||
|  | |||||||
| @ -3,9 +3,7 @@ module DegenzGame.Functions | |||||||
| open System | open System | ||||||
| open DSharpPlus | open DSharpPlus | ||||||
| open DSharpPlus.Entities | open DSharpPlus.Entities | ||||||
| open DSharpPlus.SlashCommands | open DegenzGame.Shared | ||||||
| open DegenzGame.Types |  | ||||||
| open MongoDB.Bson |  | ||||||
| 
 | 
 | ||||||
| let hackDescription = "" | let hackDescription = "" | ||||||
| 
 | 
 | ||||||
| @ -16,29 +14,6 @@ Active Hacks: {player.Attacks |> Array.toList} | |||||||
| Active Defenses: {player.Defenses |> Array.toList} | Active Defenses: {player.Defenses |> Array.toList} | ||||||
| Bank: {player.Bank}" | Bank: {player.Bank}" | ||||||
| 
 | 
 | ||||||
| let newPlayer nickname (membr : uint64) = |  | ||||||
|     let h1 = [| Weapon.Virus ; Weapon.Ransom |] |  | ||||||
|     let h2 = [| Weapon.DDos  ; Weapon.Worm |] |  | ||||||
|     let h3 = [| Weapon.Crack ; Weapon.Injection |] |  | ||||||
|     let d1 = [| Shield.Firewall   ; Shield.PortScan |] |  | ||||||
|     let d2 = [| Shield.Encryption ; Shield.Cypher |] |  | ||||||
|     let d3 = [| Shield.Hardening  ; Shield.Sanitation |] |  | ||||||
| 
 |  | ||||||
|     let rand = System.Random(System.Guid.NewGuid().GetHashCode()) |  | ||||||
|     let getRandom (actions : 'a array) = actions.[rand.Next(0,2)] |  | ||||||
| 
 |  | ||||||
|     let weapons = [| getRandom h1 ; getRandom h2 ; getRandom h3 |] |  | ||||||
|     let shields = [| getRandom d1 ; getRandom d2 ; getRandom d3 |] |  | ||||||
| 
 |  | ||||||
|     { Id = BsonObjectId(ObjectId.GenerateNewId()) |  | ||||||
|       DiscordId = membr |  | ||||||
|       Name = nickname |  | ||||||
|       Weapons = weapons |  | ||||||
|       Shields  = shields |  | ||||||
|       Attacks = [||] |  | ||||||
|       Defenses = [||] |  | ||||||
|       Bank = 0f } |  | ||||||
| 
 |  | ||||||
| let constructButtons (actionType : string) (playerInfo : string) (weapons : 'a array) = | let constructButtons (actionType : string) (playerInfo : string) (weapons : 'a array) = | ||||||
|     weapons |     weapons | ||||||
|     |> Seq.map (fun hack -> |     |> Seq.map (fun hack -> | ||||||
| @ -47,17 +22,6 @@ let constructButtons (actionType : string) (playerInfo : string) (weapons : 'a a | |||||||
|                 $"{actionType}-{hack}-{playerInfo}", |                 $"{actionType}-{hack}-{playerInfo}", | ||||||
|                 $"{hack}")) |                 $"{hack}")) | ||||||
| 
 | 
 | ||||||
| let createSimpleResponseAsync msg (ctx : InteractionContext) = |  | ||||||
|     async { |  | ||||||
|         let builder = DiscordInteractionResponseBuilder() |  | ||||||
|         builder.Content <- msg |  | ||||||
|         builder.AsEphemeral true |> ignore |  | ||||||
|         do! ctx.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource, builder) |  | ||||||
|             |> Async.AwaitTask |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
| let notYetAHackerMsg = createSimpleResponseAsync "You are not currently a hacker, first use the /redpill command to become one" |  | ||||||
| 
 |  | ||||||
| let removeExpiredActions timespan (timestamp : 'a -> DateTime) actions = | let removeExpiredActions timespan (timestamp : 'a -> DateTime) actions = | ||||||
|     actions |     actions | ||||||
|     |> Array.filter (fun act -> |     |> Array.filter (fun act -> | ||||||
|  | |||||||
| @ -17,8 +17,10 @@ | |||||||
|     <Compile Include="Functions.fs" /> |     <Compile Include="Functions.fs" /> | ||||||
|     <Compile Include="Commands.fs" /> |     <Compile Include="Commands.fs" /> | ||||||
|     <Compile Include="Program.fs" /> |     <Compile Include="Program.fs" /> | ||||||
|  |     <Content Include="paket.references" /> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="..\DbService\DbService.fsproj" /> | ||||||
|     <ProjectReference Include="..\Shared\Shared.fsproj" /> |     <ProjectReference Include="..\Shared\Shared.fsproj" /> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <Import Project="..\.paket\Paket.Restore.targets" /> |   <Import Project="..\.paket\Paket.Restore.targets" /> | ||||||
|  | |||||||
| @ -1,27 +1,16 @@ | |||||||
| module DegenzGame.Program | open System.Threading.Tasks | ||||||
| 
 |  | ||||||
| open System |  | ||||||
| open System.Threading.Tasks |  | ||||||
| open DSharpPlus | open DSharpPlus | ||||||
| open DSharpPlus.Entities | open DSharpPlus.Entities | ||||||
| open DSharpPlus.EventArgs |  | ||||||
| open DSharpPlus.SlashCommands | open DSharpPlus.SlashCommands | ||||||
| open Emzi0767.Utilities | open Emzi0767.Utilities | ||||||
| open DegenzGame.Types | open DegenzGame | ||||||
| open DegenzGame.Commands | open DegenzGame.Commands | ||||||
| open MongoDB.Driver |  | ||||||
| 
 | 
 | ||||||
| type EmptyGlobalCommandToAvoidFamousDuplicateSlashCommandsBug() = inherit ApplicationCommandModule () | type EmptyGlobalCommandToAvoidFamousDuplicateSlashCommandsBug() = inherit ApplicationCommandModule () | ||||||
| 
 | 
 | ||||||
| type HackerGame() = | type HackerGame() = | ||||||
|     inherit ApplicationCommandModule () |     inherit ApplicationCommandModule () | ||||||
| 
 | 
 | ||||||
|     [<SlashCommand("redpill", "Take the redpill and become a hacker")>] |  | ||||||
|     member _.AddHackerRole (ctx : InteractionContext) = Commands.addHackerRole ctx |  | ||||||
| 
 |  | ||||||
|     [<SlashCommand("bluepill", "Take the bluepill and become lame")>] |  | ||||||
|     member _.RemoveHackerRole (ctx : InteractionContext) = Commands.removeHackerRole ctx |  | ||||||
| 
 |  | ||||||
|     [<SlashCommand("hack", "Send a hack attack to another player")>] |     [<SlashCommand("hack", "Send a hack attack to another player")>] | ||||||
|     member this.AttackCommand (ctx : InteractionContext, [<Option("target", "The player you want to hack")>] target : DiscordUser) = |     member this.AttackCommand (ctx : InteractionContext, [<Option("target", "The player you want to hack")>] target : DiscordUser) = | ||||||
|         Commands.attack ctx target |         Commands.attack ctx target | ||||||
|  | |||||||
| @ -4,4 +4,4 @@ DSharpPlus | |||||||
| // DSharpPlus.Interactivity | // DSharpPlus.Interactivity | ||||||
| DSharpPlus.SlashCommands | DSharpPlus.SlashCommands | ||||||
| 
 | 
 | ||||||
| MongoDB.Driver | // MongoDB.Driver | ||||||
|  | |||||||
							
								
								
									
										25
									
								
								PlayerRegistration/.dockerignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								PlayerRegistration/.dockerignore
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,25 @@ | |||||||
|  | **/.dockerignore | ||||||
|  | **/.env | ||||||
|  | **/.git | ||||||
|  | **/.gitignore | ||||||
|  | **/.project | ||||||
|  | **/.settings | ||||||
|  | **/.toolstarget | ||||||
|  | **/.vs | ||||||
|  | **/.vscode | ||||||
|  | **/.idea | ||||||
|  | **/*.*proj.user | ||||||
|  | **/*.dbmdl | ||||||
|  | **/*.jfm | ||||||
|  | **/azds.yaml | ||||||
|  | **/bin | ||||||
|  | **/charts | ||||||
|  | **/docker-compose* | ||||||
|  | **/Dockerfile* | ||||||
|  | **/node_modules | ||||||
|  | **/npm-debug.log | ||||||
|  | **/obj | ||||||
|  | **/secrets.dev.yaml | ||||||
|  | **/values.dev.yaml | ||||||
|  | LICENSE | ||||||
|  | README.md | ||||||
							
								
								
									
										18
									
								
								PlayerRegistration/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								PlayerRegistration/Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,18 @@ | |||||||
|  | FROM mcr.microsoft.com/dotnet/runtime:6.0 AS base | ||||||
|  | WORKDIR /app | ||||||
|  | 
 | ||||||
|  | FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build | ||||||
|  | WORKDIR /src | ||||||
|  | COPY ["PlayerRegistration/PlayerRegistration.fsproj", "PlayerRegistration/"] | ||||||
|  | RUN dotnet restore "PlayerRegistration/PlayerRegistration.fsproj" | ||||||
|  | COPY . . | ||||||
|  | WORKDIR "/src/PlayerRegistration" | ||||||
|  | RUN dotnet build "PlayerRegistration.fsproj" -c Release -o /app/build | ||||||
|  | 
 | ||||||
|  | FROM build AS publish | ||||||
|  | RUN dotnet publish "PlayerRegistration.fsproj" -c Release -o /app/publish | ||||||
|  | 
 | ||||||
|  | FROM base AS final | ||||||
|  | WORKDIR /app | ||||||
|  | COPY --from=publish /app/publish . | ||||||
|  | ENTRYPOINT ["dotnet", "PlayerRegistration.dll"] | ||||||
							
								
								
									
										21
									
								
								PlayerRegistration/PlayerRegistration.fsproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								PlayerRegistration/PlayerRegistration.fsproj
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <OutputType>Exe</OutputType> | ||||||
|  |     <TargetFramework>net6.0</TargetFramework> | ||||||
|  |     <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <Compile Include="Program.fs" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <Content Include=".dockerignore" /> | ||||||
|  |     <Content Include="Dockerfile" /> | ||||||
|  |     <Content Include="paket.references" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="..\DbService\DbService.fsproj" /> | ||||||
|  |     <ProjectReference Include="..\Shared\Shared.fsproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <Import Project="..\.paket\Paket.Restore.targets" /> | ||||||
|  | </Project> | ||||||
							
								
								
									
										115
									
								
								PlayerRegistration/Program.fs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								PlayerRegistration/Program.fs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,115 @@ | |||||||
|  | 
 | ||||||
|  | open System.Threading.Tasks | ||||||
|  | open DegenzGame.DbService | ||||||
|  | open DSharpPlus | ||||||
|  | open DSharpPlus.SlashCommands | ||||||
|  | open DegenzGame.Shared | ||||||
|  | 
 | ||||||
|  | module Commands = | ||||||
|  |     let newPlayer nickname (membr : uint64) = | ||||||
|  |         let h1 = [| Weapon.Virus ; Weapon.Ransom |] | ||||||
|  |         let h2 = [| Weapon.DDos  ; Weapon.Worm |] | ||||||
|  |         let h3 = [| Weapon.Crack ; Weapon.Injection |] | ||||||
|  |         let d1 = [| Shield.Firewall   ; Shield.PortScan |] | ||||||
|  |         let d2 = [| Shield.Encryption ; Shield.Cypher |] | ||||||
|  |         let d3 = [| Shield.Hardening  ; Shield.Sanitation |] | ||||||
|  | 
 | ||||||
|  |         let rand = System.Random(System.Guid.NewGuid().GetHashCode()) | ||||||
|  |         let getRandom (actions : 'a array) = actions.[rand.Next(0,2)] | ||||||
|  | 
 | ||||||
|  |         let weapons = [| getRandom h1 ; getRandom h2 ; getRandom h3 |] | ||||||
|  |         let shields = [| getRandom d1 ; getRandom d2 ; getRandom d3 |] | ||||||
|  | 
 | ||||||
|  |         { DiscordId = membr | ||||||
|  |           Name = nickname | ||||||
|  |           Weapons = weapons | ||||||
|  |           Shields  = shields | ||||||
|  |           Attacks = [||] | ||||||
|  |           Defenses = [||] | ||||||
|  |           Bank = 0f } | ||||||
|  | 
 | ||||||
|  |     let addHackerRole (ctx : InteractionContext) = | ||||||
|  |         async { | ||||||
|  |             let! player = tryFindPlayer ctx.Member.Id | ||||||
|  |             let! newPlayer = | ||||||
|  |                 match player with | ||||||
|  |                 | Some _ -> async.Return false | ||||||
|  |                 | None -> | ||||||
|  |                     async { | ||||||
|  |                         do! newPlayer ctx.Member.Username ctx.Member.Id | ||||||
|  |                             |> insertNewPlayer | ||||||
|  | 
 | ||||||
|  |                         for role in ctx.Guild.Roles do | ||||||
|  |                             if role.Value.Name = "Hacker" then | ||||||
|  |                                 do! ctx.Member.GrantRoleAsync(role.Value) | ||||||
|  |                                     |> Async.AwaitTask | ||||||
|  | 
 | ||||||
|  |                         return true | ||||||
|  |                     } | ||||||
|  | 
 | ||||||
|  |             if newPlayer then | ||||||
|  |                 do! ctx.CreateResponseAsync("You are now an elite haxxor", true) | ||||||
|  |                     |> Async.AwaitTask | ||||||
|  |             else | ||||||
|  |                 do! ctx.CreateResponseAsync("Already registered as an elite haxxor", true) | ||||||
|  |                     |> Async.AwaitTask | ||||||
|  | 
 | ||||||
|  |         } |> Async.StartAsTask | ||||||
|  |         :> Task | ||||||
|  | 
 | ||||||
|  |     let removeHackerRole (ctx : InteractionContext) = | ||||||
|  |         async { | ||||||
|  |             for role in ctx.Member.Roles do | ||||||
|  |                 if role.Name = "Hacker" then | ||||||
|  |                     do! ctx.Member.RevokeRoleAsync(role) | ||||||
|  |                         |> Async.AwaitTask | ||||||
|  | 
 | ||||||
|  |             do! removePlayer ctx.Member.Id | ||||||
|  | 
 | ||||||
|  |             do! ctx.CreateResponseAsync("You are now lame", true) | ||||||
|  |                 |> Async.AwaitTask | ||||||
|  |         } |> Async.StartAsTask | ||||||
|  |         :> Task | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | type EmptyGlobalCommandToAvoidFamousDuplicateSlashCommandsBug() = inherit ApplicationCommandModule () | ||||||
|  | 
 | ||||||
|  | type PlayerRegistration() = | ||||||
|  |     inherit ApplicationCommandModule () | ||||||
|  | 
 | ||||||
|  |     [<SlashCommand("redpill", "Take the redpill and become a hacker")>] | ||||||
|  |     member _.AddHackerRole (ctx : InteractionContext) = Commands.addHackerRole ctx | ||||||
|  | 
 | ||||||
|  |     [<SlashCommand("bluepill", "Take the bluepill and become lame")>] | ||||||
|  |     member _.RemoveHackerRole (ctx : InteractionContext) = Commands.removeHackerRole ctx | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | let config = DiscordConfiguration() | ||||||
|  | config.Token <- "OTIyNDIyMDIyMTI1MDEwOTU1.YcBOcw.JxfW1CSIwEO7j6RbRFCnPZ-HoTk" | ||||||
|  | config.TokenType <- TokenType.Bot | ||||||
|  | config.Intents <- DiscordIntents.All | ||||||
|  | //config.MinimumLogLevel <- Microsoft.Extensions.Logging.LogLevel.Trace | ||||||
|  | 
 | ||||||
|  | let client = new DiscordClient(config) | ||||||
|  | 
 | ||||||
|  | //client.add_ComponentInteractionCreated(AsyncEventHandler(handleButtonEvent)) | ||||||
|  | 
 | ||||||
|  | let slash = client.UseSlashCommands() | ||||||
|  | 
 | ||||||
|  | // My server | ||||||
|  | slash.RegisterCommands<PlayerRegistration>(922419263275425832uL); | ||||||
|  | // Degenz | ||||||
|  | //slash.RegisterCommands<HackerGame>(922414052708327494uL); | ||||||
|  | 
 | ||||||
|  | client.ConnectAsync () | ||||||
|  | |> Async.AwaitTask | ||||||
|  | |> Async.RunSynchronously | ||||||
|  | 
 | ||||||
|  | Task.Delay(-1) | ||||||
|  | |> Async.AwaitTask | ||||||
|  | |> Async.RunSynchronously | ||||||
|  | 
 | ||||||
|  | client.DisconnectAsync () | ||||||
|  | |> Async.AwaitTask | ||||||
|  | |> Async.RunSynchronously | ||||||
|  | 
 | ||||||
							
								
								
									
										7
									
								
								PlayerRegistration/paket.references
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								PlayerRegistration/paket.references
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | |||||||
|  | FSharp.Core | ||||||
|  | DSharpPlus | ||||||
|  | // DSharpPlus.CommandsNext | ||||||
|  | // DSharpPlus.Interactivity | ||||||
|  | DSharpPlus.SlashCommands | ||||||
|  | 
 | ||||||
|  | // MongoDB.Driver | ||||||
| @ -6,6 +6,7 @@ | |||||||
|   </PropertyGroup> |   </PropertyGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <Compile Include="Types.fs" /> |     <Compile Include="Types.fs" /> | ||||||
|  |     <Content Include="paket.references" /> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <Import Project="..\.paket\Paket.Restore.targets" /> |   <Import Project="..\.paket\Paket.Restore.targets" /> | ||||||
| </Project> | </Project> | ||||||
| @ -1,7 +1,9 @@ | |||||||
| module DegenzGame.Types | module DegenzGame.Shared | ||||||
| 
 | 
 | ||||||
| open System | open System | ||||||
| open MongoDB.Bson | open DSharpPlus | ||||||
|  | open DSharpPlus.Entities | ||||||
|  | open DSharpPlus.SlashCommands | ||||||
| 
 | 
 | ||||||
| type ActionClass = | type ActionClass = | ||||||
|     | Network |     | Network | ||||||
| @ -54,7 +56,6 @@ type Defense = { | |||||||
| 
 | 
 | ||||||
| [<CLIMutable>] | [<CLIMutable>] | ||||||
| type Player = { | type Player = { | ||||||
|     Id : BsonObjectId |  | ||||||
|     DiscordId : uint64 |     DiscordId : uint64 | ||||||
|     Name : string |     Name : string | ||||||
|     Weapons : Weapon array |     Weapons : Weapon array | ||||||
| @ -64,4 +65,13 @@ type Player = { | |||||||
|     Bank : single |     Bank : single | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | let createSimpleResponseAsync msg (ctx : InteractionContext) = | ||||||
|  |     async { | ||||||
|  |         let builder = DiscordInteractionResponseBuilder() | ||||||
|  |         builder.Content <- msg | ||||||
|  |         builder.AsEphemeral true |> ignore | ||||||
|  |         do! ctx.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource, builder) | ||||||
|  |             |> Async.AwaitTask | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|  | let notYetAHackerMsg = createSimpleResponseAsync "You are not currently a hacker, first use the /redpill command to become one" | ||||||
| @ -1,2 +1,3 @@ | |||||||
| FSharp.Core | FSharp.Core | ||||||
| MongoDB.Driver | DSharpPlus | ||||||
|  | DSharpPlus.SlashCommands | ||||||
|  | |||||||
| @ -11,8 +11,10 @@ | |||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <Content Include=".dockerignore" /> |     <Content Include=".dockerignore" /> | ||||||
|     <Content Include="Dockerfile" /> |     <Content Include="Dockerfile" /> | ||||||
|  |     <Content Include="paket.references" /> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="..\DbService\DbService.fsproj" /> | ||||||
|     <ProjectReference Include="..\Shared\Shared.fsproj" /> |     <ProjectReference Include="..\Shared\Shared.fsproj" /> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <Import Project="..\.paket\Paket.Restore.targets" /> |   <Import Project="..\.paket\Paket.Restore.targets" /> | ||||||
|  | |||||||
| @ -4,4 +4,4 @@ DSharpPlus | |||||||
| // DSharpPlus.Interactivity | // DSharpPlus.Interactivity | ||||||
| DSharpPlus.SlashCommands | DSharpPlus.SlashCommands | ||||||
| 
 | 
 | ||||||
| MongoDB.Driver | // MongoDB.Driver | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user