From b14af1c00866f8453d895e4f9521db2c6150a211 Mon Sep 17 00:00:00 2001 From: Armano den Boef <68127614+Rozen4334@users.noreply.github.com> Date: Thu, 27 Jan 2022 14:50:49 +0100 Subject: [PATCH] Adding Entity guides, flowcharts, better sample system. (#2054) * initial * Interaction glossary entry * Sharded Interaction sample * Renames into solution * Debugging samples * Modify target location for webhookclient * Finalizing docs work, resolving docfx errors. * Adding threaduser to user chart * Add branch info to readme. * Edits to user chart * Resolve format for glossary entries * Patch sln target * Issue with file naming fixed * Patch 1/x for builds * Appending suggestions --- Discord.Net.sln | 227 ++++++++++-------- README.md | 19 ++ docs/faq/basics/basic-operations.md | 2 +- docs/faq/misc/legacy.md | 2 +- docs/faq/toc.yml | 2 - docs/guides/entities/casting.md | 68 ++++++ .../{faq/misc => guides/entities}/glossary.md | 78 +++--- docs/guides/entities/images/IChannel.png | Bin 0 -> 59573 bytes docs/guides/entities/images/IInteraction.png | Bin 0 -> 37766 bytes docs/guides/entities/images/IMessage.png | Bin 0 -> 36939 bytes docs/guides/entities/images/IUser.png | Bin 0 -> 63210 bytes .../entities.md => entities/introduction.md} | 60 +++-- docs/guides/entities/samples/casting.cs | 7 + docs/guides/entities/samples/restentities.cs | 8 + .../entities/samples/safety-cast-pass.cs | 10 + .../entities/samples/safety-cast-var.cs | 9 + docs/guides/entities/samples/safety-cast.cs | 8 + .../samples/socketentities.cs} | 0 docs/guides/entities/samples/unboxing.cs | 9 + docs/guides/toc.yml | 10 +- samples/01_basic_ping_bot/Program.cs | 77 ------ .../04_interactions_framework/ExampleEnum.cs | 16 -- samples/BasicBot/Program.cs | 112 +++++++++ .../_BasicBot.csproj} | 0 .../Attributes/DoUserCheckAttribute.cs | 37 +++ .../Attributes}/RequireOwnerAttribute.cs | 2 +- .../CommandHandler.cs | 14 +- samples/InteractionFramework/ExampleEnum.cs | 10 + .../Modules/ComponentModule.cs | 18 ++ .../Modules/GeneralModule.cs} | 13 +- .../Modules/MessageCommandModule.cs | 30 +++ .../Modules/SlashCommandModule.cs | 51 ++++ .../Modules/UserCommandModule.cs | 17 ++ .../Program.cs | 10 +- .../_InteractionFramework.csproj} | 2 +- .../Modules/InteractionModule.cs | 18 ++ .../Modules/PublicModule.cs | 4 +- .../Program.cs | 24 +- .../Services/CommandHandlingService.cs | 14 +- .../Services/InteractionHandlingService.cs | 57 +++++ .../_ShardedClient.csproj} | 3 +- .../Modules/PublicModule.cs | 8 +- .../Program.cs | 12 +- .../Services/CommandHandlingService.cs | 21 +- .../Services/PictureService.cs | 2 +- .../_TextCommandFramework.csproj} | 1 + .../Program.cs | 2 +- .../_WebhookClient.csproj} | 4 +- samples/_idn/Inspector.cs | 74 ++++++ samples/_idn/Program.cs | 152 ++++++++++++ samples/_idn/idn.csproj | 16 ++ samples/_idn/logview.ps1 | 1 + samples/idn/Program.cs | 16 +- .../Channels/IGuildChannel.Examples.cs | 14 +- .../Channels/IMessageChannel.Examples.cs | 9 +- .../Core/Entities/Users/IUser.Examples.cs | 2 +- .../BaseSocketClient.Events.Examples.cs | 15 +- 57 files changed, 1056 insertions(+), 341 deletions(-) create mode 100644 docs/guides/entities/casting.md rename docs/{faq/misc => guides/entities}/glossary.md (58%) create mode 100644 docs/guides/entities/images/IChannel.png create mode 100644 docs/guides/entities/images/IInteraction.png create mode 100644 docs/guides/entities/images/IMessage.png create mode 100644 docs/guides/entities/images/IUser.png rename docs/guides/{concepts/entities.md => entities/introduction.md} (60%) create mode 100644 docs/guides/entities/samples/casting.cs create mode 100644 docs/guides/entities/samples/restentities.cs create mode 100644 docs/guides/entities/samples/safety-cast-pass.cs create mode 100644 docs/guides/entities/samples/safety-cast-var.cs create mode 100644 docs/guides/entities/samples/safety-cast.cs rename docs/guides/{concepts/samples/entities.cs => entities/samples/socketentities.cs} (100%) create mode 100644 docs/guides/entities/samples/unboxing.cs delete mode 100644 samples/01_basic_ping_bot/Program.cs delete mode 100644 samples/04_interactions_framework/ExampleEnum.cs create mode 100644 samples/BasicBot/Program.cs rename samples/{01_basic_ping_bot/01_basic_ping_bot.csproj => BasicBot/_BasicBot.csproj} (100%) create mode 100644 samples/InteractionFramework/Attributes/DoUserCheckAttribute.cs rename samples/{04_interactions_framework => InteractionFramework/Attributes}/RequireOwnerAttribute.cs (96%) rename samples/{04_interactions_framework => InteractionFramework}/CommandHandler.cs (95%) create mode 100644 samples/InteractionFramework/ExampleEnum.cs create mode 100644 samples/InteractionFramework/Modules/ComponentModule.cs rename samples/{04_interactions_framework/Modules/UtilityModule.cs => InteractionFramework/Modules/GeneralModule.cs} (93%) create mode 100644 samples/InteractionFramework/Modules/MessageCommandModule.cs create mode 100644 samples/InteractionFramework/Modules/SlashCommandModule.cs create mode 100644 samples/InteractionFramework/Modules/UserCommandModule.cs rename samples/{04_interactions_framework => InteractionFramework}/Program.cs (96%) rename samples/{04_interactions_framework/04_interactions_framework.csproj => InteractionFramework/_InteractionFramework.csproj} (94%) create mode 100644 samples/ShardedClient/Modules/InteractionModule.cs rename samples/{03_sharded_client => ShardedClient}/Modules/PublicModule.cs (93%) rename samples/{03_sharded_client => ShardedClient}/Program.cs (83%) rename samples/{03_sharded_client => ShardedClient}/Services/CommandHandlingService.cs (95%) create mode 100644 samples/ShardedClient/Services/InteractionHandlingService.cs rename samples/{03_sharded_client/03_sharded_client.csproj => ShardedClient/_ShardedClient.csproj} (76%) rename samples/{02_commands_framework => TextCommandFramework}/Modules/PublicModule.cs (96%) rename samples/{02_commands_framework => TextCommandFramework}/Program.cs (97%) rename samples/{02_commands_framework => TextCommandFramework}/Services/CommandHandlingService.cs (92%) rename samples/{02_commands_framework => TextCommandFramework}/Services/PictureService.cs (91%) rename samples/{02_commands_framework/02_commands_framework.csproj => TextCommandFramework/_TextCommandFramework.csproj} (90%) rename samples/{04_webhook_client => WebhookClient}/Program.cs (97%) rename samples/{04_webhook_client/04_webhook_client.csproj => WebhookClient/_WebhookClient.csproj} (69%) create mode 100644 samples/_idn/Inspector.cs create mode 100644 samples/_idn/Program.cs create mode 100644 samples/_idn/idn.csproj create mode 100644 samples/_idn/logview.ps1 diff --git a/Discord.Net.sln b/Discord.Net.sln index c22d91e27..fc68eb71c 100644 --- a/Discord.Net.sln +++ b/Discord.Net.sln @@ -4,43 +4,45 @@ VisualStudioVersion = 17.1.31903.286 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Core", "src\Discord.Net.Core\Discord.Net.Core.csproj", "{91E9E7BD-75C9-4E98-84AA-2C271922E5C2}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Impls", "Impls", "{288C363D-A636-4EAE-9AC1-4698B641B26E}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Rest", "src\Discord.Net.Rest\Discord.Net.Rest.csproj", "{BFC6DC28-0351-4573-926A-D4124244C04F}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Commands", "src\Discord.Net.Commands\Discord.Net.Commands.csproj", "{078DD7E6-943D-4D09-AFC2-D2BA58B76C9C}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.WebSocket", "src\Discord.Net.WebSocket\Discord.Net.WebSocket.csproj", "{688FD1D8-7F01-4539-B2E9-F473C5D699C7}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Extensions", "Extensions", "{CC3D4B1C-9DE0-448B-8AE7-F3F1F3EC5C3A}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Webhook", "src\Discord.Net.Webhook\Discord.Net.Webhook.csproj", "{9AFAB80E-D2D3-4EDB-B58C-BACA78D1EA30}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{BB59D5B5-E7B0-4BF4-8F82-D14431B2799B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Examples", "src\Discord.Net.Examples\Discord.Net.Examples.csproj", "{47820065-3CFB-401C-ACEA-862BD564A404}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "01_basic_ping_bot", "samples\01_basic_ping_bot\01_basic_ping_bot.csproj", "{F2FF84FB-F6AD-47E5-9EE5-18206CAE136E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Interactions", "src\Discord.Net.Interactions\Discord.Net.Interactions.csproj", "{137DB209-B357-4EE8-A6EE-4B6127F6DEE9}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "02_commands_framework", "samples\02_commands_framework\02_commands_framework.csproj", "{4E1F1F40-B1DD-40C9-A4B1-A2046A4C9C76}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Analyzers", "src\Discord.Net.Analyzers\Discord.Net.Analyzers.csproj", "{24C231FD-8CF3-444A-9E7C-45C18BAD4A0D}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "03_sharded_client", "samples\03_sharded_client\03_sharded_client.csproj", "{9B4C4AFB-3D15-44C6-9E36-12ED625AAA26}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Analyzers.Tests", "test\Discord.Net.Analyzers.Tests\Discord.Net.Analyzers.Tests.csproj", "{FC67057C-E92F-4E1C-98BE-46F839C8AD71}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Tests.Unit", "test\Discord.Net.Tests.Unit\Discord.Net.Tests.Unit.csproj", "{DBF8B16E-5967-4480-8EDE-15D98A0DF0C4}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Tests.Integration", "test\Discord.Net.Tests.Integration\Discord.Net.Tests.Integration.csproj", "{E169E15A-E82C-45BF-8C24-C2CADB7093AA}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{C7CF5621-7D36-433B-B337-5A2E3C101A71}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "_BasicBot", "samples\BasicBot\_BasicBot.csproj", "{F2FF84FB-F6AD-47E5-9EE5-18206CAE136E}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Analyzers.Tests", "test\Discord.Net.Analyzers.Tests\Discord.Net.Analyzers.Tests.csproj", "{FC67057C-E92F-4E1C-98BE-46F839C8AD71}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "_TextCommandFramework", "samples\TextCommandFramework\_TextCommandFramework.csproj", "{4E1F1F40-B1DD-40C9-A4B1-A2046A4C9C76}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Examples", "src\Discord.Net.Examples\Discord.Net.Examples.csproj", "{47820065-3CFB-401C-ACEA-862BD564A404}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "_ShardedClient", "samples\ShardedClient\_ShardedClient.csproj", "{9B4C4AFB-3D15-44C6-9E36-12ED625AAA26}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "idn", "samples\idn\idn.csproj", "{4A03840B-9EBE-47E3-89AB-E0914DF21AFB}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "_InteractionFramework", "samples\InteractionFramework\_InteractionFramework.csproj", "{A23E46D2-1610-4AE5-820F-422D34810887}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Interactions", "src\Discord.Net.Interactions\Discord.Net.Interactions.csproj", "{137DB209-B357-4EE8-A6EE-4B6127F6DEE9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "_WebhookClient", "samples\WebhookClient\_WebhookClient.csproj", "{B61AAE66-15CC-40E4-873A-C23E697C3411}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "04_interactions_framework", "samples\04_interactions_framework\04_interactions_framework.csproj", "{A23E46D2-1610-4AE5-820F-422D34810887}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IDN", "samples\idn\idn.csproj", "{4A03840B-9EBE-47E3-89AB-E0914DF21AFB}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Analyzers", "src\Discord.Net.Analyzers\Discord.Net.Analyzers.csproj", "{24C231FD-8CF3-444A-9E7C-45C18BAD4A0D}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{C7CF5621-7D36-433B-B337-5A2E3C101A71}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Impls", "Impls", "{288C363D-A636-4EAE-9AC1-4698B641B26E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Extensions", "Extensions", "{CC3D4B1C-9DE0-448B-8AE7-F3F1F3EC5C3A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{BB59D5B5-E7B0-4BF4-8F82-D14431B2799B}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -112,6 +114,78 @@ Global {9AFAB80E-D2D3-4EDB-B58C-BACA78D1EA30}.Release|x64.Build.0 = Release|Any CPU {9AFAB80E-D2D3-4EDB-B58C-BACA78D1EA30}.Release|x86.ActiveCfg = Release|Any CPU {9AFAB80E-D2D3-4EDB-B58C-BACA78D1EA30}.Release|x86.Build.0 = Release|Any CPU + {47820065-3CFB-401C-ACEA-862BD564A404}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {47820065-3CFB-401C-ACEA-862BD564A404}.Debug|Any CPU.Build.0 = Debug|Any CPU + {47820065-3CFB-401C-ACEA-862BD564A404}.Debug|x64.ActiveCfg = Debug|Any CPU + {47820065-3CFB-401C-ACEA-862BD564A404}.Debug|x64.Build.0 = Debug|Any CPU + {47820065-3CFB-401C-ACEA-862BD564A404}.Debug|x86.ActiveCfg = Debug|Any CPU + {47820065-3CFB-401C-ACEA-862BD564A404}.Debug|x86.Build.0 = Debug|Any CPU + {47820065-3CFB-401C-ACEA-862BD564A404}.Release|Any CPU.ActiveCfg = Release|Any CPU + {47820065-3CFB-401C-ACEA-862BD564A404}.Release|Any CPU.Build.0 = Release|Any CPU + {47820065-3CFB-401C-ACEA-862BD564A404}.Release|x64.ActiveCfg = Release|Any CPU + {47820065-3CFB-401C-ACEA-862BD564A404}.Release|x64.Build.0 = Release|Any CPU + {47820065-3CFB-401C-ACEA-862BD564A404}.Release|x86.ActiveCfg = Release|Any CPU + {47820065-3CFB-401C-ACEA-862BD564A404}.Release|x86.Build.0 = Release|Any CPU + {137DB209-B357-4EE8-A6EE-4B6127F6DEE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {137DB209-B357-4EE8-A6EE-4B6127F6DEE9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {137DB209-B357-4EE8-A6EE-4B6127F6DEE9}.Debug|x64.ActiveCfg = Debug|Any CPU + {137DB209-B357-4EE8-A6EE-4B6127F6DEE9}.Debug|x64.Build.0 = Debug|Any CPU + {137DB209-B357-4EE8-A6EE-4B6127F6DEE9}.Debug|x86.ActiveCfg = Debug|Any CPU + {137DB209-B357-4EE8-A6EE-4B6127F6DEE9}.Debug|x86.Build.0 = Debug|Any CPU + {137DB209-B357-4EE8-A6EE-4B6127F6DEE9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {137DB209-B357-4EE8-A6EE-4B6127F6DEE9}.Release|Any CPU.Build.0 = Release|Any CPU + {137DB209-B357-4EE8-A6EE-4B6127F6DEE9}.Release|x64.ActiveCfg = Release|Any CPU + {137DB209-B357-4EE8-A6EE-4B6127F6DEE9}.Release|x64.Build.0 = Release|Any CPU + {137DB209-B357-4EE8-A6EE-4B6127F6DEE9}.Release|x86.ActiveCfg = Release|Any CPU + {137DB209-B357-4EE8-A6EE-4B6127F6DEE9}.Release|x86.Build.0 = Release|Any CPU + {24C231FD-8CF3-444A-9E7C-45C18BAD4A0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {24C231FD-8CF3-444A-9E7C-45C18BAD4A0D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {24C231FD-8CF3-444A-9E7C-45C18BAD4A0D}.Debug|x64.ActiveCfg = Debug|Any CPU + {24C231FD-8CF3-444A-9E7C-45C18BAD4A0D}.Debug|x64.Build.0 = Debug|Any CPU + {24C231FD-8CF3-444A-9E7C-45C18BAD4A0D}.Debug|x86.ActiveCfg = Debug|Any CPU + {24C231FD-8CF3-444A-9E7C-45C18BAD4A0D}.Debug|x86.Build.0 = Debug|Any CPU + {24C231FD-8CF3-444A-9E7C-45C18BAD4A0D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {24C231FD-8CF3-444A-9E7C-45C18BAD4A0D}.Release|Any CPU.Build.0 = Release|Any CPU + {24C231FD-8CF3-444A-9E7C-45C18BAD4A0D}.Release|x64.ActiveCfg = Release|Any CPU + {24C231FD-8CF3-444A-9E7C-45C18BAD4A0D}.Release|x64.Build.0 = Release|Any CPU + {24C231FD-8CF3-444A-9E7C-45C18BAD4A0D}.Release|x86.ActiveCfg = Release|Any CPU + {24C231FD-8CF3-444A-9E7C-45C18BAD4A0D}.Release|x86.Build.0 = Release|Any CPU + {FC67057C-E92F-4E1C-98BE-46F839C8AD71}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FC67057C-E92F-4E1C-98BE-46F839C8AD71}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FC67057C-E92F-4E1C-98BE-46F839C8AD71}.Debug|x64.ActiveCfg = Debug|Any CPU + {FC67057C-E92F-4E1C-98BE-46F839C8AD71}.Debug|x64.Build.0 = Debug|Any CPU + {FC67057C-E92F-4E1C-98BE-46F839C8AD71}.Debug|x86.ActiveCfg = Debug|Any CPU + {FC67057C-E92F-4E1C-98BE-46F839C8AD71}.Debug|x86.Build.0 = Debug|Any CPU + {FC67057C-E92F-4E1C-98BE-46F839C8AD71}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FC67057C-E92F-4E1C-98BE-46F839C8AD71}.Release|Any CPU.Build.0 = Release|Any CPU + {FC67057C-E92F-4E1C-98BE-46F839C8AD71}.Release|x64.ActiveCfg = Release|Any CPU + {FC67057C-E92F-4E1C-98BE-46F839C8AD71}.Release|x64.Build.0 = Release|Any CPU + {FC67057C-E92F-4E1C-98BE-46F839C8AD71}.Release|x86.ActiveCfg = Release|Any CPU + {FC67057C-E92F-4E1C-98BE-46F839C8AD71}.Release|x86.Build.0 = Release|Any CPU + {DBF8B16E-5967-4480-8EDE-15D98A0DF0C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DBF8B16E-5967-4480-8EDE-15D98A0DF0C4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DBF8B16E-5967-4480-8EDE-15D98A0DF0C4}.Debug|x64.ActiveCfg = Debug|Any CPU + {DBF8B16E-5967-4480-8EDE-15D98A0DF0C4}.Debug|x64.Build.0 = Debug|Any CPU + {DBF8B16E-5967-4480-8EDE-15D98A0DF0C4}.Debug|x86.ActiveCfg = Debug|Any CPU + {DBF8B16E-5967-4480-8EDE-15D98A0DF0C4}.Debug|x86.Build.0 = Debug|Any CPU + {DBF8B16E-5967-4480-8EDE-15D98A0DF0C4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DBF8B16E-5967-4480-8EDE-15D98A0DF0C4}.Release|Any CPU.Build.0 = Release|Any CPU + {DBF8B16E-5967-4480-8EDE-15D98A0DF0C4}.Release|x64.ActiveCfg = Release|Any CPU + {DBF8B16E-5967-4480-8EDE-15D98A0DF0C4}.Release|x64.Build.0 = Release|Any CPU + {DBF8B16E-5967-4480-8EDE-15D98A0DF0C4}.Release|x86.ActiveCfg = Release|Any CPU + {DBF8B16E-5967-4480-8EDE-15D98A0DF0C4}.Release|x86.Build.0 = Release|Any CPU + {E169E15A-E82C-45BF-8C24-C2CADB7093AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E169E15A-E82C-45BF-8C24-C2CADB7093AA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E169E15A-E82C-45BF-8C24-C2CADB7093AA}.Debug|x64.ActiveCfg = Debug|Any CPU + {E169E15A-E82C-45BF-8C24-C2CADB7093AA}.Debug|x64.Build.0 = Debug|Any CPU + {E169E15A-E82C-45BF-8C24-C2CADB7093AA}.Debug|x86.ActiveCfg = Debug|Any CPU + {E169E15A-E82C-45BF-8C24-C2CADB7093AA}.Debug|x86.Build.0 = Debug|Any CPU + {E169E15A-E82C-45BF-8C24-C2CADB7093AA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E169E15A-E82C-45BF-8C24-C2CADB7093AA}.Release|Any CPU.Build.0 = Release|Any CPU + {E169E15A-E82C-45BF-8C24-C2CADB7093AA}.Release|x64.ActiveCfg = Release|Any CPU + {E169E15A-E82C-45BF-8C24-C2CADB7093AA}.Release|x64.Build.0 = Release|Any CPU + {E169E15A-E82C-45BF-8C24-C2CADB7093AA}.Release|x86.ActiveCfg = Release|Any CPU + {E169E15A-E82C-45BF-8C24-C2CADB7093AA}.Release|x86.Build.0 = Release|Any CPU {F2FF84FB-F6AD-47E5-9EE5-18206CAE136E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F2FF84FB-F6AD-47E5-9EE5-18206CAE136E}.Debug|Any CPU.Build.0 = Debug|Any CPU {F2FF84FB-F6AD-47E5-9EE5-18206CAE136E}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -148,78 +222,6 @@ Global {9B4C4AFB-3D15-44C6-9E36-12ED625AAA26}.Release|x64.Build.0 = Release|Any CPU {9B4C4AFB-3D15-44C6-9E36-12ED625AAA26}.Release|x86.ActiveCfg = Release|Any CPU {9B4C4AFB-3D15-44C6-9E36-12ED625AAA26}.Release|x86.Build.0 = Release|Any CPU - {DBF8B16E-5967-4480-8EDE-15D98A0DF0C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DBF8B16E-5967-4480-8EDE-15D98A0DF0C4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DBF8B16E-5967-4480-8EDE-15D98A0DF0C4}.Debug|x64.ActiveCfg = Debug|Any CPU - {DBF8B16E-5967-4480-8EDE-15D98A0DF0C4}.Debug|x64.Build.0 = Debug|Any CPU - {DBF8B16E-5967-4480-8EDE-15D98A0DF0C4}.Debug|x86.ActiveCfg = Debug|Any CPU - {DBF8B16E-5967-4480-8EDE-15D98A0DF0C4}.Debug|x86.Build.0 = Debug|Any CPU - {DBF8B16E-5967-4480-8EDE-15D98A0DF0C4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DBF8B16E-5967-4480-8EDE-15D98A0DF0C4}.Release|Any CPU.Build.0 = Release|Any CPU - {DBF8B16E-5967-4480-8EDE-15D98A0DF0C4}.Release|x64.ActiveCfg = Release|Any CPU - {DBF8B16E-5967-4480-8EDE-15D98A0DF0C4}.Release|x64.Build.0 = Release|Any CPU - {DBF8B16E-5967-4480-8EDE-15D98A0DF0C4}.Release|x86.ActiveCfg = Release|Any CPU - {DBF8B16E-5967-4480-8EDE-15D98A0DF0C4}.Release|x86.Build.0 = Release|Any CPU - {E169E15A-E82C-45BF-8C24-C2CADB7093AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E169E15A-E82C-45BF-8C24-C2CADB7093AA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E169E15A-E82C-45BF-8C24-C2CADB7093AA}.Debug|x64.ActiveCfg = Debug|Any CPU - {E169E15A-E82C-45BF-8C24-C2CADB7093AA}.Debug|x64.Build.0 = Debug|Any CPU - {E169E15A-E82C-45BF-8C24-C2CADB7093AA}.Debug|x86.ActiveCfg = Debug|Any CPU - {E169E15A-E82C-45BF-8C24-C2CADB7093AA}.Debug|x86.Build.0 = Debug|Any CPU - {E169E15A-E82C-45BF-8C24-C2CADB7093AA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E169E15A-E82C-45BF-8C24-C2CADB7093AA}.Release|Any CPU.Build.0 = Release|Any CPU - {E169E15A-E82C-45BF-8C24-C2CADB7093AA}.Release|x64.ActiveCfg = Release|Any CPU - {E169E15A-E82C-45BF-8C24-C2CADB7093AA}.Release|x64.Build.0 = Release|Any CPU - {E169E15A-E82C-45BF-8C24-C2CADB7093AA}.Release|x86.ActiveCfg = Release|Any CPU - {E169E15A-E82C-45BF-8C24-C2CADB7093AA}.Release|x86.Build.0 = Release|Any CPU - {FC67057C-E92F-4E1C-98BE-46F839C8AD71}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FC67057C-E92F-4E1C-98BE-46F839C8AD71}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FC67057C-E92F-4E1C-98BE-46F839C8AD71}.Debug|x64.ActiveCfg = Debug|Any CPU - {FC67057C-E92F-4E1C-98BE-46F839C8AD71}.Debug|x64.Build.0 = Debug|Any CPU - {FC67057C-E92F-4E1C-98BE-46F839C8AD71}.Debug|x86.ActiveCfg = Debug|Any CPU - {FC67057C-E92F-4E1C-98BE-46F839C8AD71}.Debug|x86.Build.0 = Debug|Any CPU - {FC67057C-E92F-4E1C-98BE-46F839C8AD71}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FC67057C-E92F-4E1C-98BE-46F839C8AD71}.Release|Any CPU.Build.0 = Release|Any CPU - {FC67057C-E92F-4E1C-98BE-46F839C8AD71}.Release|x64.ActiveCfg = Release|Any CPU - {FC67057C-E92F-4E1C-98BE-46F839C8AD71}.Release|x64.Build.0 = Release|Any CPU - {FC67057C-E92F-4E1C-98BE-46F839C8AD71}.Release|x86.ActiveCfg = Release|Any CPU - {FC67057C-E92F-4E1C-98BE-46F839C8AD71}.Release|x86.Build.0 = Release|Any CPU - {47820065-3CFB-401C-ACEA-862BD564A404}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {47820065-3CFB-401C-ACEA-862BD564A404}.Debug|Any CPU.Build.0 = Debug|Any CPU - {47820065-3CFB-401C-ACEA-862BD564A404}.Debug|x64.ActiveCfg = Debug|Any CPU - {47820065-3CFB-401C-ACEA-862BD564A404}.Debug|x64.Build.0 = Debug|Any CPU - {47820065-3CFB-401C-ACEA-862BD564A404}.Debug|x86.ActiveCfg = Debug|Any CPU - {47820065-3CFB-401C-ACEA-862BD564A404}.Debug|x86.Build.0 = Debug|Any CPU - {47820065-3CFB-401C-ACEA-862BD564A404}.Release|Any CPU.ActiveCfg = Release|Any CPU - {47820065-3CFB-401C-ACEA-862BD564A404}.Release|Any CPU.Build.0 = Release|Any CPU - {47820065-3CFB-401C-ACEA-862BD564A404}.Release|x64.ActiveCfg = Release|Any CPU - {47820065-3CFB-401C-ACEA-862BD564A404}.Release|x64.Build.0 = Release|Any CPU - {47820065-3CFB-401C-ACEA-862BD564A404}.Release|x86.ActiveCfg = Release|Any CPU - {47820065-3CFB-401C-ACEA-862BD564A404}.Release|x86.Build.0 = Release|Any CPU - {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Debug|x64.ActiveCfg = Debug|Any CPU - {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Debug|x64.Build.0 = Debug|Any CPU - {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Debug|x86.ActiveCfg = Debug|Any CPU - {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Debug|x86.Build.0 = Debug|Any CPU - {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Release|Any CPU.Build.0 = Release|Any CPU - {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Release|x64.ActiveCfg = Release|Any CPU - {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Release|x64.Build.0 = Release|Any CPU - {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Release|x86.ActiveCfg = Release|Any CPU - {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Release|x86.Build.0 = Release|Any CPU - {137DB209-B357-4EE8-A6EE-4B6127F6DEE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {137DB209-B357-4EE8-A6EE-4B6127F6DEE9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {137DB209-B357-4EE8-A6EE-4B6127F6DEE9}.Debug|x64.ActiveCfg = Debug|Any CPU - {137DB209-B357-4EE8-A6EE-4B6127F6DEE9}.Debug|x64.Build.0 = Debug|Any CPU - {137DB209-B357-4EE8-A6EE-4B6127F6DEE9}.Debug|x86.ActiveCfg = Debug|Any CPU - {137DB209-B357-4EE8-A6EE-4B6127F6DEE9}.Debug|x86.Build.0 = Debug|Any CPU - {137DB209-B357-4EE8-A6EE-4B6127F6DEE9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {137DB209-B357-4EE8-A6EE-4B6127F6DEE9}.Release|Any CPU.Build.0 = Release|Any CPU - {137DB209-B357-4EE8-A6EE-4B6127F6DEE9}.Release|x64.ActiveCfg = Release|Any CPU - {137DB209-B357-4EE8-A6EE-4B6127F6DEE9}.Release|x64.Build.0 = Release|Any CPU - {137DB209-B357-4EE8-A6EE-4B6127F6DEE9}.Release|x86.ActiveCfg = Release|Any CPU - {137DB209-B357-4EE8-A6EE-4B6127F6DEE9}.Release|x86.Build.0 = Release|Any CPU {A23E46D2-1610-4AE5-820F-422D34810887}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A23E46D2-1610-4AE5-820F-422D34810887}.Debug|Any CPU.Build.0 = Debug|Any CPU {A23E46D2-1610-4AE5-820F-422D34810887}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -232,18 +234,30 @@ Global {A23E46D2-1610-4AE5-820F-422D34810887}.Release|x64.Build.0 = Release|Any CPU {A23E46D2-1610-4AE5-820F-422D34810887}.Release|x86.ActiveCfg = Release|Any CPU {A23E46D2-1610-4AE5-820F-422D34810887}.Release|x86.Build.0 = Release|Any CPU - {24C231FD-8CF3-444A-9E7C-45C18BAD4A0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {24C231FD-8CF3-444A-9E7C-45C18BAD4A0D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {24C231FD-8CF3-444A-9E7C-45C18BAD4A0D}.Debug|x64.ActiveCfg = Debug|Any CPU - {24C231FD-8CF3-444A-9E7C-45C18BAD4A0D}.Debug|x64.Build.0 = Debug|Any CPU - {24C231FD-8CF3-444A-9E7C-45C18BAD4A0D}.Debug|x86.ActiveCfg = Debug|Any CPU - {24C231FD-8CF3-444A-9E7C-45C18BAD4A0D}.Debug|x86.Build.0 = Debug|Any CPU - {24C231FD-8CF3-444A-9E7C-45C18BAD4A0D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {24C231FD-8CF3-444A-9E7C-45C18BAD4A0D}.Release|Any CPU.Build.0 = Release|Any CPU - {24C231FD-8CF3-444A-9E7C-45C18BAD4A0D}.Release|x64.ActiveCfg = Release|Any CPU - {24C231FD-8CF3-444A-9E7C-45C18BAD4A0D}.Release|x64.Build.0 = Release|Any CPU - {24C231FD-8CF3-444A-9E7C-45C18BAD4A0D}.Release|x86.ActiveCfg = Release|Any CPU - {24C231FD-8CF3-444A-9E7C-45C18BAD4A0D}.Release|x86.Build.0 = Release|Any CPU + {B61AAE66-15CC-40E4-873A-C23E697C3411}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B61AAE66-15CC-40E4-873A-C23E697C3411}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B61AAE66-15CC-40E4-873A-C23E697C3411}.Debug|x64.ActiveCfg = Debug|Any CPU + {B61AAE66-15CC-40E4-873A-C23E697C3411}.Debug|x64.Build.0 = Debug|Any CPU + {B61AAE66-15CC-40E4-873A-C23E697C3411}.Debug|x86.ActiveCfg = Debug|Any CPU + {B61AAE66-15CC-40E4-873A-C23E697C3411}.Debug|x86.Build.0 = Debug|Any CPU + {B61AAE66-15CC-40E4-873A-C23E697C3411}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B61AAE66-15CC-40E4-873A-C23E697C3411}.Release|Any CPU.Build.0 = Release|Any CPU + {B61AAE66-15CC-40E4-873A-C23E697C3411}.Release|x64.ActiveCfg = Release|Any CPU + {B61AAE66-15CC-40E4-873A-C23E697C3411}.Release|x64.Build.0 = Release|Any CPU + {B61AAE66-15CC-40E4-873A-C23E697C3411}.Release|x86.ActiveCfg = Release|Any CPU + {B61AAE66-15CC-40E4-873A-C23E697C3411}.Release|x86.Build.0 = Release|Any CPU + {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Debug|x64.ActiveCfg = Debug|Any CPU + {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Debug|x64.Build.0 = Debug|Any CPU + {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Debug|x86.ActiveCfg = Debug|Any CPU + {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Debug|x86.Build.0 = Debug|Any CPU + {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Release|Any CPU.Build.0 = Release|Any CPU + {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Release|x64.ActiveCfg = Release|Any CPU + {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Release|x64.Build.0 = Release|Any CPU + {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Release|x86.ActiveCfg = Release|Any CPU + {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -253,17 +267,18 @@ Global {078DD7E6-943D-4D09-AFC2-D2BA58B76C9C} = {CC3D4B1C-9DE0-448B-8AE7-F3F1F3EC5C3A} {688FD1D8-7F01-4539-B2E9-F473C5D699C7} = {288C363D-A636-4EAE-9AC1-4698B641B26E} {9AFAB80E-D2D3-4EDB-B58C-BACA78D1EA30} = {CC3D4B1C-9DE0-448B-8AE7-F3F1F3EC5C3A} + {47820065-3CFB-401C-ACEA-862BD564A404} = {BB59D5B5-E7B0-4BF4-8F82-D14431B2799B} + {137DB209-B357-4EE8-A6EE-4B6127F6DEE9} = {CC3D4B1C-9DE0-448B-8AE7-F3F1F3EC5C3A} + {24C231FD-8CF3-444A-9E7C-45C18BAD4A0D} = {CC3D4B1C-9DE0-448B-8AE7-F3F1F3EC5C3A} + {FC67057C-E92F-4E1C-98BE-46F839C8AD71} = {C7CF5621-7D36-433B-B337-5A2E3C101A71} + {DBF8B16E-5967-4480-8EDE-15D98A0DF0C4} = {C7CF5621-7D36-433B-B337-5A2E3C101A71} + {E169E15A-E82C-45BF-8C24-C2CADB7093AA} = {C7CF5621-7D36-433B-B337-5A2E3C101A71} {F2FF84FB-F6AD-47E5-9EE5-18206CAE136E} = {BB59D5B5-E7B0-4BF4-8F82-D14431B2799B} {4E1F1F40-B1DD-40C9-A4B1-A2046A4C9C76} = {BB59D5B5-E7B0-4BF4-8F82-D14431B2799B} {9B4C4AFB-3D15-44C6-9E36-12ED625AAA26} = {BB59D5B5-E7B0-4BF4-8F82-D14431B2799B} - {DBF8B16E-5967-4480-8EDE-15D98A0DF0C4} = {C7CF5621-7D36-433B-B337-5A2E3C101A71} - {E169E15A-E82C-45BF-8C24-C2CADB7093AA} = {C7CF5621-7D36-433B-B337-5A2E3C101A71} - {FC67057C-E92F-4E1C-98BE-46F839C8AD71} = {C7CF5621-7D36-433B-B337-5A2E3C101A71} - {47820065-3CFB-401C-ACEA-862BD564A404} = {BB59D5B5-E7B0-4BF4-8F82-D14431B2799B} - {4A03840B-9EBE-47E3-89AB-E0914DF21AFB} = {BB59D5B5-E7B0-4BF4-8F82-D14431B2799B} - {137DB209-B357-4EE8-A6EE-4B6127F6DEE9} = {CC3D4B1C-9DE0-448B-8AE7-F3F1F3EC5C3A} {A23E46D2-1610-4AE5-820F-422D34810887} = {BB59D5B5-E7B0-4BF4-8F82-D14431B2799B} - {24C231FD-8CF3-444A-9E7C-45C18BAD4A0D} = {CC3D4B1C-9DE0-448B-8AE7-F3F1F3EC5C3A} + {B61AAE66-15CC-40E4-873A-C23E697C3411} = {BB59D5B5-E7B0-4BF4-8F82-D14431B2799B} + {4A03840B-9EBE-47E3-89AB-E0914DF21AFB} = {BB59D5B5-E7B0-4BF4-8F82-D14431B2799B} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {D2404771-EEC8-45F2-9D71-F3373F6C1495} diff --git a/README.md b/README.md index cf0293359..541948f4b 100644 --- a/README.md +++ b/README.md @@ -81,3 +81,22 @@ Due to the nature of the Discord API, we will oftentimes need to add a property Furthermore, while we will never break the API (outside of interface changes) on minor builds, we will occasionally need to break the ABI, by introducing parameters to a method to match changes upstream with Discord. As such, a minor version increment may require you to recompile your code, and dependencies, such as addons, may also need to be recompiled and republished on the newer version. When a binary breaking change is made, the change will be noted in the release notes. An increment of the MAJOR component indicates that breaking changes have been made to the library; consumers should check the release notes to determine what changes need to be made. + +## Branches + +### Release/X.X + +Release branch following Major.Minor. Upon release, patches will be pushed to these branches. +New NuGet releases will be tagged on these branches. + +### Dev + +Development branch, available on MyGet. This branch is what pull requests are targetted to. + +### Feature/X + +Branches that target Dev, adding new features. Feel free to explore these branches and give feedback where necessary. + +### Docs/X + +Usually targets Dev. These branches are used to update documentation with either new features or existing feature rework. diff --git a/docs/faq/basics/basic-operations.md b/docs/faq/basics/basic-operations.md index d6121dbb0..6adfa1f1f 100644 --- a/docs/faq/basics/basic-operations.md +++ b/docs/faq/basics/basic-operations.md @@ -53,7 +53,7 @@ able to message. You may check the message channel type. Visit [Glossary] to see the various types of channels. -[glossary]: xref:FAQ.Glossary#message-channels +[Glossary]: xref:Guides.Entities.Glossary#channels ## How can I get the guild from a message? diff --git a/docs/faq/misc/legacy.md b/docs/faq/misc/legacy.md index ddb2d03c6..fbfb41ac2 100644 --- a/docs/faq/misc/legacy.md +++ b/docs/faq/misc/legacy.md @@ -24,6 +24,6 @@ Visit the repo's [release tag] to see the latest public pre-release. The `DependencyMap` has been replaced with Microsoft's [DependencyInjection] Abstractions. An example usage can be seen -[here](https://github.com/foxbot/DiscordBotBase/blob/csharp/src/DiscordBot/Program.cs#L36). +[here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/release/3.x/samples/InteractionFramework/Program.cs#L66). [DependencyInjection]: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection diff --git a/docs/faq/toc.yml b/docs/faq/toc.yml index 5a7e7e7f2..2f04dc98c 100644 --- a/docs/faq/toc.yml +++ b/docs/faq/toc.yml @@ -16,7 +16,5 @@ topicUid: FAQ.Commands.Interactions - name: Dependency Injection topicUid: FAQ.Commands.DI -- name: Glossary - topicUid: FAQ.Glossary - name: Legacy or Upgrade topicUid: FAQ.Legacy diff --git a/docs/guides/entities/casting.md b/docs/guides/entities/casting.md new file mode 100644 index 000000000..3a314c67f --- /dev/null +++ b/docs/guides/entities/casting.md @@ -0,0 +1,68 @@ +--- +uid: Guides.Entities.Casting +title: Casting & Unboxing +--- + +# Casting + +Casting can be done in many ways, and is the only method to box and unbox types to/from their base definition. +Casting only works for types that inherit the base type that you want to unbox from. +`IUser` cannot be cast to `IMessage`. + +> [!NOTE] +> Interfaces **can** be cast to other interfaces, as long as they inherit each other. +> The same goes for reverse casting. As long as some entity can be simplified into what it inherits, your cast will pass. + +## Boxing + +A boxed object is the definition of an object that was simplified (or trimmed) by incoming traffic, +but still owns the data of the originally constructed type. Boxing is an implicit operation. + +Through casting, we can **unbox** this type, and access the properties that were unaccessible before. + +## Unboxing + +Unboxing is the most direct way to access the real definition of an object. +If we want to return a type from its interface, we can unbox it directly. + +[!code-csharp[Unboxing](samples/unboxing.cs)] + +## Regular casting + +In 'regular' casting, we use the `as` keyword to assign the given type to the object. +If the boxed type can indeed be cast into given type, +it will become said type, and its properties can be accessed. +[!code-csharp[Casting](samples/casting.cs)] + +> [!WARNING] +> If the type you're casting to is null, a `NullReferenceException` will be thrown when it's called. +> This makes safety casting much more interesting to use, as it prevents this exception from being thrown. + +## Safety casting + +Safety casting makes sure that the type you're trying to cast to can never be null, as it passes checks upon calling them. + +There are 3 different ways to safety cast an object: + +### Basic safety casting: + +To safety cast an object, all we need to do is check if it is of the member type in a statement. +If this check fails, it will continue below, making sure we don't try to access null. +[!code-csharp[Base](samples/safety-cast.cs)] + +### Object declaration: + +Here we declare the object we are casting to, +making it so that you can immediately work with its properties without reassigning through regular casting. +[!code-csharp[Declare](samples/safety-cast-var.cs)] + +### Reverse passage: + +In previous examples, we want to let code continue running after the check, or if the check fails. +In this example, the cast will return the entire method (ignoring the latter) upon failure, +and declare the variable for further use into the method: +[!code-csharp[Pass](samples/safety-cast-pass.cs)] + +> [!NOTE] +> Usage of `is`, `not` and `as` is required in cast assignment and/or type checks. `==`, `!=` and `=` are invalid assignment, +> as these operators only apply to initialized objects and not their types. diff --git a/docs/faq/misc/glossary.md b/docs/guides/entities/glossary.md similarity index 58% rename from docs/faq/misc/glossary.md rename to docs/guides/entities/glossary.md index 232690917..4ac6dd593 100644 --- a/docs/faq/misc/glossary.md +++ b/docs/guides/entities/glossary.md @@ -1,29 +1,19 @@ --- -uid: FAQ.Glossary -title: Common Terminologies / Glossary +uid: Guides.Entities.Glossary +title: Glossary & Flowcharts --- -# Glossary +# Entity Types -This is an additional chapter for quick references to various common -types that you may see within Discord.Net. To see more information -regarding each type of object, click on the object to navigate -to our API documentation page where you might find more explanation -about it. +A list of all Discord.Net entities, what they can be cast to and what their properties are. -## Common Types - -* A **Guild** ([IGuild]) is an isolated collection of users and -channels, and are often referred to as "servers". - - Example: [Discord API](https://discord.gg/jkrBmQR) -* A **Channel** ([IChannel]) represents a generic channel. - - Example: #dotnet_discord-net - - See [Channel Types](#channel-types) +> [!NOTE] +> All interfaces have the same inheritance tree for both `Socket` and `Rest` entities. +> Entities with that have been marked red are exclusive to the project they source from. -[IGuild]: xref:Discord.IGuild -[IChannel]: xref:Discord.IChannel +## Channels -## Channel Types +![IChannelChart](images/IChannel.png) ### Message Channels * A **Text Channel** ([ITextChannel]) is a message channel from a Guild. @@ -40,14 +30,11 @@ channels, and are often referred to as "servers". - This can be any channels that may exist in a guild. * A **Voice Channel** ([IVoiceChannel]) is a voice channel in a guild. * A **Stage Channel** ([IStageChannel]) is a stage channel in a guild. -* A **Category Channel** ([ICategoryChannel]) (2.0+) is a category that +* A **Category Channel** ([ICategoryChannel]) is a category that holds one or more sub-channels. -* A **Nested Channel** ([INestedChannel]) (2.0+) is a channel that can +* A **Nested Channel** ([INestedChannel]) is a channel that can exist under a category. -> [!NOTE] -> A Channel ([IChannel]) can be all types of channels. - [INestedChannel]: xref:Discord.INestedChannel [IGuildChannel]: xref:Discord.IGuildChannel [IMessageChannel]: xref:Discord.IMessageChannel @@ -62,17 +49,27 @@ exist under a category. [IStageChannel]: xref:Discord.IStageChannel [INewsChannel]: xref:Discord.INewsChannel -## Message Types +## Messages + +![IMessageChart](images/IMessage.png) +* A **Rest Followup Message** ([RestFollowupMessage]) is a message returned by followup on on an interaction. +* A **Rest Interaction Message** ([RestInteractionMessage]) is a message returned by the interaction's original response. +* A **Rest User Message** ([RestUserMessage]) is a message sent over rest; it can be any of the above. * An **User Message** ([IUserMessage]) is a message sent by a user. * A **System Message** ([ISystemMessage]) is a message sent by Discord itself. * A **Message** ([IMessage]) can be any of the above. +[RestFollowupMessage]: xref:Discord.Rest.RestFollowupMessage +[RestInteractionMessage]: xref:Discord.Rest.RestInteractionMessage +[RestUserMEssage]: xref:Discord.Rest.RestUserMessage [IUserMessage]: xref:Discord.IUserMessage [ISystemMessage]: xref:Discord.ISystemMessage [IMessage]: xref:Discord.IMessage -## User Types +## Users + +![IUserChart](images/IUser.png) * A **Guild User** ([IGuildUser]) is a user available inside a guild. * A **Group User** ([IGroupUser]) is a user available inside a group. @@ -85,7 +82,29 @@ exist under a category. [ISelfUser]: xref:Discord.ISelfUser [IUser]: xref:Discord.IUser -## Emoji Types +## Interactions + +![IInteractionChart](images/IInteraction.png) + +* A **Slash command** ([ISlashCommandInteraction]) is an application command executed in the text box, with provided parameters. +* A **Message Command** ([IMessageCommandInteraction]) is an application command targetting a message. +* An **User Command** ([IUserCommandInteraction]) is an application command targetting a user. +* An **Application Command** ([IApplicationCommandInteraction]) is any of the above. +* A **Message component** ([IMessageComponent]) is the interaction of a button being clicked/dropdown option(s) entered. +* An **Autocomplete Interaction** ([IAutocompleteinteraction]) is an interaction that has been automatically completed. +* An **Interaction** ([IDiscordInteraction]) is any of the above. + +[ISlashCommandInteraction]: xref:Discord.ISlashCommandInteraction +[IMessageCommandInteraction]: xref:Discord.IMessageCommandInteraction +[IUserCommandInteraction]: xref:Discord.IUserCommandInteraction +[IApplicationCommandInteraction]: xref:Discord.IApplicationCommandInteraction +[IMessageComponent]: xref:Discord.IMessageComponent +[IAutocompleteinteraction]: xref:Discord.IAutocompleteInteraction +[IDiscordInteraction]: xref:Discord.IDiscordInteraction + +## Other types: + +### Emoji * An **Emote** ([Emote]) is a custom emote from a guild. - Example: `<:dotnet:232902710280716288>` @@ -95,8 +114,7 @@ exist under a category. [Emote]: xref:Discord.Emote [Emoji]: xref:Discord.Emoji - -## Sticker Types +### Stickers * A **Sticker** ([ISticker]) is a standard Discord sticker. * A **Custom Sticker ([ICustomSticker]) is a Guild-unique sticker. @@ -104,7 +122,7 @@ exist under a category. [ISticker]: xref:Discord.ISticker [ICustomSticker]: xref:Discord.ICustomSticker -## Activity Types +### Activity * A **Game** ([Game]) refers to a user's game activity. * A **Rich Presence** ([RichGame]) refers to a user's detailed diff --git a/docs/guides/entities/images/IChannel.png b/docs/guides/entities/images/IChannel.png new file mode 100644 index 0000000000000000000000000000000000000000..e2cda78f347f066e1073c9214fe61368f58ac3f3 GIT binary patch literal 59573 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

w&R1X{k5jI; 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 i_@A{&Axq{F literal 0 HcmV?d00001 diff --git a/docs/guides/entities/images/IInteraction.png b/docs/guides/entities/images/IInteraction.png new file mode 100644 index 0000000000000000000000000000000000000000..93ca7895d16b046860e64b277d68dda121e6696c GIT binary patch literal 37766 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 literal 0 HcmV?d00001 diff --git a/docs/guides/entities/images/IMessage.png b/docs/guides/entities/images/IMessage.png new file mode 100644 index 0000000000000000000000000000000000000000..eff4b1dbed7a196a0dfe80952115c9ed4b94b9ee GIT binary patch literal 36939 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

Bp28S?bV^6;-%bny?ZfT-`?N=SoGh81O7}Cr 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࢟h0c8&-3lGE1)9ah2MX(A(R_^u)xG$ z$q5ArUYs#4otbwugUAa)7%LQ~)W$%W1?ud6lSFZLeEBg4xU@gB)#8;!OFuA=*Z?bg z(M|NznGow;AidAa&z}oSJ_5uj-CTqzI-5Rhl1h%Bw$S*$Pms~pq%mnIy0C_`>N{ceSW zP|aU5f@*)mCY0a->&^si0APASNeCzVcn2@O-3{8|#U9d=kp(qs#$Y{r$ulcokjJlj zulLuZh`Do!1n9P!1|C0t=Ld|ZxhUbS_-}$hU4}mn3i=4R0-wY*hH@iV3(O2jRU`5{ zKT^Wgi+J8{KE4T~QV9;lJtXTCNHflJBR;6rsR2@Opm?I4#ndx|h6WiQRxg$^oVvAma`1bsrD_P|oAax&Wx*9`X_N(Xv{d;jpY*4R2_JA4

djE>P5Up@ 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 TAZN`(1wQ(^COTDGcOw4>LFvxo literal 0 HcmV?d00001 diff --git a/docs/guides/concepts/entities.md b/docs/guides/entities/introduction.md similarity index 60% rename from docs/guides/concepts/entities.md rename to docs/guides/entities/introduction.md index e3ca7db32..46e220bc8 100644 --- a/docs/guides/concepts/entities.md +++ b/docs/guides/entities/introduction.md @@ -1,26 +1,41 @@ --- -uid: Guides.Concepts.Entities -title: Entities +uid: Guides.Entities.Intro +title: Introduction --- # Entities in Discord.Net -> [!NOTE] -> This article is written with the Socket variants of entities in mind, -> not the general interfaces or Rest entities. - Discord.Net provides a versatile entity system for navigating the Discord API. +> [!TIP] +> It is **vital** that you use the proper IDs for an entity when using +> a `GetXXX` method. It is recommended that you enable Discord's +> _developer mode_ to allow easy access to entity IDs, found in +> Settings > Appearance > Advanced. Read more about it in the +> [FAQ](xref:FAQ.Basics.GetStarted) page. + ## Inheritance Due to the nature of the Discord API, some entities are designed with -multiple variants; for example, `SocketUser` and `SocketGuildUser`. +multiple variants; for example, `IUser` and `IGuildUser`. All models will contain the most detailed version of an entity possible, even if the type is less detailed. -For example, in the case of the `MessageReceived` event, a +## Socket & REST + +REST entities are retrieved over REST, and will be disposed after use. +It is suggested to limit the amount of REST calls as much as possible, +as calls over REST interact with the API, and are thus prone to rate-limits. + +- [Learn more about REST](https://restfulapi.net/) + +Socket entities are created through the gateway, +most commonly through `DiscordSocketClient` events. +These entities will enter the clients' global cache for later use. + +In the case of the `MessageReceived` event, a `SocketMessage` is passed in with a channel property of type `SocketMessageChannel`. All messages come from channels capable of messaging, so this is the only variant of a channel that can cover @@ -31,7 +46,9 @@ But that doesn't mean a message _can't_ come from a retrieve information about a guild from a message entity, you will need to cast its channel object to a `SocketTextChannel`. -You can find out various types of entities in the [Glossary page.](xref:FAQ.Glossary) +> [!NOTE] +> You can find out the inheritance tree & definitions of various entities +> [here](xref:Guides.Entities.Glossary) ## Navigation @@ -40,26 +57,31 @@ you to easily navigate to an entity's parent or children. As explained above, you will sometimes need to cast to a more detailed version of an entity to navigate to its parent. -## Accessing Entities +## Accessing Socket Entities The most basic forms of entities, `SocketGuild`, `SocketUser`, and `SocketChannel` can be pulled from the DiscordSocketClient's global cache, and can be retrieved using the respective `GetXXX` method on DiscordSocketClient. -> [!TIP] -> It is **vital** that you use the proper IDs for an entity when using -> a `GetXXX` method. It is recommended that you enable Discord's -> _developer mode_ to allow easy access to entity IDs, found in -> Settings > Appearance > Advanced. Read more about it in the -> [FAQ](xref:FAQ.Basics.GetStarted) page. - More detailed versions of entities can be pulled from the basic entities, e.g., `SocketGuild.GetUser`, which returns a `SocketGuildUser`, or `SocketGuild.GetChannel`, which returns a `SocketGuildChannel`. Again, you may need to cast these objects to get a variant of the type that you need. -## Sample +### Sample + +[!code-csharp[Socket Sample](samples/socketentities.cs)] + +## Accessing REST Entities + +REST entities work almost the same as Socket entities, but are much less frequently used. +To access REST entities, the `DiscordSocketClient`'s `Rest` property is required. +Another option here is to create your own [DiscordRestClient], independent of the Socket gateway. + +[DiscordRestClient]: xref:Discord.Rest.DiscordRestClient + +### Sample -[!code-csharp[Entity Sample](samples/entities.cs)] +[!code-csharp[Rest Sample](samples/restentities.cs)] diff --git a/docs/guides/entities/samples/casting.cs b/docs/guides/entities/samples/casting.cs new file mode 100644 index 000000000..0a7b9d16e --- /dev/null +++ b/docs/guides/entities/samples/casting.cs @@ -0,0 +1,7 @@ +// Say we have an entity; for the simplicity of this example, it will appear from thin air. +IChannel channel; + +// If we want this to be an ITextChannel so we can access the properties of a text channel inside of a guild, an approach would be: +ITextChannel textChannel = channel as ITextChannel; + +await textChannel.DoSomethingICantWithIChannelAsync(); diff --git a/docs/guides/entities/samples/restentities.cs b/docs/guides/entities/samples/restentities.cs new file mode 100644 index 000000000..36a817780 --- /dev/null +++ b/docs/guides/entities/samples/restentities.cs @@ -0,0 +1,8 @@ +// RestUser entities expose the accent color and banner of a user. +// This being one of the few use-cases for requesting a RestUser instead of depending on the Socket counterpart. +public static EmbedBuilder WithUserColor(this EmbedBuilder builder, IUser user) +{ + var restUser = await _client.Rest.GetUserAsync(user.Id); + return builder.WithColor(restUser.AccentColor ?? Color.Blue); + // The accent color can still be null, so a check for this needs to be done to prevent an exception to be thrown. +} diff --git a/docs/guides/entities/samples/safety-cast-pass.cs b/docs/guides/entities/samples/safety-cast-pass.cs new file mode 100644 index 000000000..03407746f --- /dev/null +++ b/docs/guides/entities/samples/safety-cast-pass.cs @@ -0,0 +1,10 @@ +private void MyFunction(IMessage message) +{ + // Here we do the reverse as in the previous examples, and let it continue the code below if it IS an IUserMessage + if (message is not IUserMessage userMessage) + return; + + // Because we do the above check inline (don't give the statement a body), + // the code will still declare `userMessage` as available outside of the above statement. + Console.WriteLine(userMessage.Author); +} diff --git a/docs/guides/entities/samples/safety-cast-var.cs b/docs/guides/entities/samples/safety-cast-var.cs new file mode 100644 index 000000000..bf62a2095 --- /dev/null +++ b/docs/guides/entities/samples/safety-cast-var.cs @@ -0,0 +1,9 @@ +IUser user; + +// Here we can pre-define the actual declaration of said IGuildUser object, +// so we don't need to cast additionally inside of the statement. +if (user is IGuildUser guildUser) +{ + Console.WriteLine(guildUser.JoinedAt); +} +// Check failed. diff --git a/docs/guides/entities/samples/safety-cast.cs b/docs/guides/entities/samples/safety-cast.cs new file mode 100644 index 000000000..684cff845 --- /dev/null +++ b/docs/guides/entities/samples/safety-cast.cs @@ -0,0 +1,8 @@ +IUser user; + +// Here we check if the user is an IGuildUser, if not, let it pass. This ensures its not null. +if (user is IGuildUser) +{ + Console.WriteLine("This user is in a guild!"); +} +// Check failed. diff --git a/docs/guides/concepts/samples/entities.cs b/docs/guides/entities/samples/socketentities.cs similarity index 100% rename from docs/guides/concepts/samples/entities.cs rename to docs/guides/entities/samples/socketentities.cs diff --git a/docs/guides/entities/samples/unboxing.cs b/docs/guides/entities/samples/unboxing.cs new file mode 100644 index 000000000..78dd7ea02 --- /dev/null +++ b/docs/guides/entities/samples/unboxing.cs @@ -0,0 +1,9 @@ +IUser user; + +// Here we use inline unboxing to make a call to its member (if available) only once. + +// Note that if the entity we're trying to cast to is null, this will throw a NullReferenceException. +Console.WriteLine(((IGuildUser)user).Nickname); + +// In case you are certain the entity IS said member, you can also use unboxing to declare variables. +IGuildUser guildUser = (IGuildUser)user; diff --git a/docs/guides/toc.yml b/docs/guides/toc.yml index cf4ea5516..d4f2984f8 100644 --- a/docs/guides/toc.yml +++ b/docs/guides/toc.yml @@ -21,8 +21,14 @@ topicUid: Guides.Concepts.Events - name: Managing Connections topicUid: Guides.Concepts.ManageConnections - - name: Entities - topicUid: Guides.Concepts.Entities +- name: Entities + items: + - name: Introduction + topicUid: Guides.Entities.Intro + - name: Casting + topicUid: Guides.Entities.Casting + - name: Glossary & Flowcharts + topicUid: Guides.Entities.Glossary - name: Working with Text-based Commands items: - name: Introduction diff --git a/samples/01_basic_ping_bot/Program.cs b/samples/01_basic_ping_bot/Program.cs deleted file mode 100644 index 7fbe04993..000000000 --- a/samples/01_basic_ping_bot/Program.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -using System.Threading; -using System.Threading.Tasks; -using Discord; -using Discord.WebSocket; - -namespace _01_basic_ping_bot -{ - // This is a minimal, bare-bones example of using Discord.Net - // - // If writing a bot with commands, we recommend using the Discord.Net.Commands - // framework, rather than handling commands yourself, like we do in this sample. - // - // You can find samples of using the command framework: - // - Here, under the 02_commands_framework sample - // - https://github.com/foxbot/DiscordBotBase - a bare-bones bot template - // - https://github.com/foxbot/patek - a more feature-filled bot, utilizing more aspects of the library - class Program - { - private readonly DiscordSocketClient _client; - - // Discord.Net heavily utilizes TAP for async, so we create - // an asynchronous context from the beginning. - static void Main(string[] args) - { - new Program().MainAsync().GetAwaiter().GetResult(); - } - - public Program() - { - // It is recommended to Dispose of a client when you are finished - // using it, at the end of your app's lifetime. - _client = new DiscordSocketClient(); - - _client.Log += LogAsync; - _client.Ready += ReadyAsync; - _client.MessageReceived += MessageReceivedAsync; - } - - public async Task MainAsync() - { - // Tokens should be considered secret data, and never hard-coded. - await _client.LoginAsync(TokenType.Bot, Environment.GetEnvironmentVariable("token")); - await _client.StartAsync(); - - // Block the program until it is closed. - await Task.Delay(Timeout.Infinite); - } - - private Task LogAsync(LogMessage log) - { - Console.WriteLine(log.ToString()); - return Task.CompletedTask; - } - - // The Ready event indicates that the client has opened a - // connection and it is now safe to access the cache. - private Task ReadyAsync() - { - Console.WriteLine($"{_client.CurrentUser} is connected!"); - - return Task.CompletedTask; - } - - // This is not the recommended way to write a bot - consider - // reading over the Commands Framework sample. - private async Task MessageReceivedAsync(SocketMessage message) - { - // The bot should never respond to itself. - if (message.Author.Id == _client.CurrentUser.Id) - return; - - if (message.Content == "!ping") - await message.Channel.SendMessageAsync("pong!"); - } - } -} diff --git a/samples/04_interactions_framework/ExampleEnum.cs b/samples/04_interactions_framework/ExampleEnum.cs deleted file mode 100644 index 2ea5733c0..000000000 --- a/samples/04_interactions_framework/ExampleEnum.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace _04_interactions_framework -{ - public enum ExampleEnum - { - First, - Second, - Third, - Fourth - } -} diff --git a/samples/BasicBot/Program.cs b/samples/BasicBot/Program.cs new file mode 100644 index 000000000..179dfce05 --- /dev/null +++ b/samples/BasicBot/Program.cs @@ -0,0 +1,112 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Discord; +using Discord.WebSocket; + +namespace BasicBot +{ + // This is a minimal, bare-bones example of using Discord.Net. + // + // If writing a bot with commands/interactions, we recommend using the Discord.Net.Commands/Discord.Net.Interactions + // framework, rather than handling them yourself, like we do in this sample. + // + // You can find samples of using the command framework: + // - Here, under the TextCommandFramework sample + // - At the guides: https://discordnet.dev/guides/text_commands/intro.html + // + // You can find samples of using the interaction framework: + // - Here, under the InteractionFramework sample + // - At the guides: https://discordnet.dev/guides/int_framework/intro.html + class Program + { + // Non-static readonly fields can only be assigned in a constructor. + // If you want to assign it elsewhere, consider removing the readonly keyword. + private readonly DiscordSocketClient _client; + + // Discord.Net heavily utilizes TAP for async, so we create + // an asynchronous context from the beginning. + static void Main(string[] args) + => new Program() + .MainAsync() + .GetAwaiter() + .GetResult(); + + public Program() + { + // It is recommended to Dispose of a client when you are finished + // using it, at the end of your app's lifetime. + _client = new DiscordSocketClient(); + + // Subscribing to client events, so that we may receive them whenever they're invoked. + _client.Log += LogAsync; + _client.Ready += ReadyAsync; + _client.MessageReceived += MessageReceivedAsync; + _client.InteractionCreated += InteractionCreatedAsync; + } + + public async Task MainAsync() + { + // Tokens should be considered secret data, and never hard-coded. + await _client.LoginAsync(TokenType.Bot, Environment.GetEnvironmentVariable("token")); + // Different approaches to making your token a secret is by putting them in local .json, .yaml, .xml or .txt files, then reading them on startup. + + await _client.StartAsync(); + + // Block the program until it is closed. + await Task.Delay(Timeout.Infinite); + } + + private Task LogAsync(LogMessage log) + { + Console.WriteLine(log.ToString()); + return Task.CompletedTask; + } + + // The Ready event indicates that the client has opened a + // connection and it is now safe to access the cache. + private Task ReadyAsync() + { + Console.WriteLine($"{_client.CurrentUser} is connected!"); + + return Task.CompletedTask; + } + + // This is not the recommended way to write a bot - consider + // reading over the Commands Framework sample. + private async Task MessageReceivedAsync(SocketMessage message) + { + // The bot should never respond to itself. + if (message.Author.Id == _client.CurrentUser.Id) + return; + + + if (message.Content == "!ping") + { + // Create a new componentbuilder, in which dropdowns & buttons can be created. + var cb = new ComponentBuilder() + .WithButton("Click me!", "unique-id", ButtonStyle.Primary); + + // Send a message with content 'pong', including a button. + // This button needs to be build by calling .Build() before being passed into the call. + await message.Channel.SendMessageAsync("pong!", components: cb.Build()); + } + } + + // For better functionality & a more developer-friendly approach to handling any kind of interaction, refer to: + // https://discordnet.dev/guides/int_framework/intro.html + private async Task InteractionCreatedAsync(SocketInteraction interaction) + { + // safety-casting is the best way to prevent something being cast from being null. + // If this check does not pass, it could not be cast to said type. + if (interaction is SocketMessageComponent component) + { + // Check for the ID created in the button mentioned above. + if (component.Data.CustomId == "unique-id") + await interaction.RespondAsync("Thank you for clicking my button!"); + + else Console.WriteLine("An ID has been received that has no handler!"); + } + } + } +} diff --git a/samples/01_basic_ping_bot/01_basic_ping_bot.csproj b/samples/BasicBot/_BasicBot.csproj similarity index 100% rename from samples/01_basic_ping_bot/01_basic_ping_bot.csproj rename to samples/BasicBot/_BasicBot.csproj diff --git a/samples/InteractionFramework/Attributes/DoUserCheckAttribute.cs b/samples/InteractionFramework/Attributes/DoUserCheckAttribute.cs new file mode 100644 index 000000000..96266cdff --- /dev/null +++ b/samples/InteractionFramework/Attributes/DoUserCheckAttribute.cs @@ -0,0 +1,37 @@ +using Discord; +using Discord.Interactions; +using Discord.WebSocket; +using System; +using System.Threading.Tasks; + +namespace InteractionFramework.Attributes +{ + internal class DoUserCheck : PreconditionAttribute + { + public override Task CheckRequirementsAsync(IInteractionContext context, ICommandInfo commandInfo, IServiceProvider services) + { + // Check if the component matches the target properly. + if (context.Interaction is not SocketMessageComponent componentContext) + return Task.FromResult(PreconditionResult.FromError("Context unrecognized as component context.")); + + else + { + // The approach here entirely depends on how you construct your custom ID. In this case, the format is: + // unique-name:*,* + + // here the name and wildcards are split by ':' + var param = componentContext.Data.CustomId.Split(':'); + + // here we determine that we should always check for the first ',' present. + // This will deal with additional wildcards by always selecting the first wildcard present. + if (param.Length > 1 && ulong.TryParse(param[1].Split(',')[0], out ulong id)) + return (context.User.Id == id) + // If the user ID + ? Task.FromResult(PreconditionResult.FromSuccess()) + : Task.FromResult(PreconditionResult.FromError("User ID does not match component ID!")); + + else return Task.FromResult(PreconditionResult.FromError("Parse cannot be done if no userID exists.")); + } + } + } +} diff --git a/samples/04_interactions_framework/RequireOwnerAttribute.cs b/samples/InteractionFramework/Attributes/RequireOwnerAttribute.cs similarity index 96% rename from samples/04_interactions_framework/RequireOwnerAttribute.cs rename to samples/InteractionFramework/Attributes/RequireOwnerAttribute.cs index 2f2493838..7b0e57a46 100644 --- a/samples/04_interactions_framework/RequireOwnerAttribute.cs +++ b/samples/InteractionFramework/Attributes/RequireOwnerAttribute.cs @@ -6,7 +6,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace _04_interactions_framework +namespace InteractionFramework.Attributes { public class RequireOwnerAttribute : PreconditionAttribute { diff --git a/samples/04_interactions_framework/CommandHandler.cs b/samples/InteractionFramework/CommandHandler.cs similarity index 95% rename from samples/04_interactions_framework/CommandHandler.cs rename to samples/InteractionFramework/CommandHandler.cs index 735557da5..9a505246f 100644 --- a/samples/04_interactions_framework/CommandHandler.cs +++ b/samples/InteractionFramework/CommandHandler.cs @@ -2,13 +2,10 @@ using Discord; using Discord.Interactions; using Discord.WebSocket; using System; -using System.Collections.Generic; -using System.Linq; using System.Reflection; -using System.Text; using System.Threading.Tasks; -namespace _04_interactions_framework +namespace InteractionFramework { public class CommandHandler { @@ -27,6 +24,9 @@ namespace _04_interactions_framework { // Add the public modules that inherit InteractionModuleBase to the InteractionService await _commands.AddModulesAsync(Assembly.GetEntryAssembly(), _services); + // Another approach to get the assembly of a specific type is: + // typeof(CommandHandler).Assembly + // Process the InteractionCreated payloads to execute Interactions commands _client.InteractionCreated += HandleInteraction; @@ -37,6 +37,8 @@ namespace _04_interactions_framework _commands.ComponentCommandExecuted += ComponentCommandExecuted; } + # region Error Handling + private Task ComponentCommandExecuted (ComponentCommandInfo arg1, Discord.IInteractionContext arg2, IResult arg3) { if (!arg3.IsSuccess) @@ -123,6 +125,9 @@ namespace _04_interactions_framework return Task.CompletedTask; } + # endregion + + # region Execution private async Task HandleInteraction (SocketInteraction arg) { @@ -142,5 +147,6 @@ namespace _04_interactions_framework await arg.GetOriginalResponseAsync().ContinueWith(async (msg) => await msg.Result.DeleteAsync()); } } + # endregion } } diff --git a/samples/InteractionFramework/ExampleEnum.cs b/samples/InteractionFramework/ExampleEnum.cs new file mode 100644 index 000000000..755f33d17 --- /dev/null +++ b/samples/InteractionFramework/ExampleEnum.cs @@ -0,0 +1,10 @@ +namespace InteractionFramework +{ + public enum ExampleEnum + { + First, + Second, + Third, + Fourth + } +} diff --git a/samples/InteractionFramework/Modules/ComponentModule.cs b/samples/InteractionFramework/Modules/ComponentModule.cs new file mode 100644 index 000000000..643004ded --- /dev/null +++ b/samples/InteractionFramework/Modules/ComponentModule.cs @@ -0,0 +1,18 @@ +using Discord.Interactions; +using Discord.WebSocket; +using InteractionFramework.Attributes; +using System.Threading.Tasks; + +namespace InteractionFramework +{ + // As with all other modules, we create the context by defining what type of interaction this module is supposed to target. + internal class ComponentModule : InteractionModuleBase> + { + // With the Attribute DoUserCheck you can make sure that only the user this button targets can click it. This is defined by the first wildcard: *. + // See Attributes/DoUserCheckAttribute.cs for elaboration. + [DoUserCheck] + [ComponentInteraction("myButton:*")] + public async Task ClickButtonAsync(string userId) + => await RespondAsync(text: ":thumbsup: Clicked!"); + } +} diff --git a/samples/04_interactions_framework/Modules/UtilityModule.cs b/samples/InteractionFramework/Modules/GeneralModule.cs similarity index 93% rename from samples/04_interactions_framework/Modules/UtilityModule.cs rename to samples/InteractionFramework/Modules/GeneralModule.cs index d6cbb1a9f..78740a960 100644 --- a/samples/04_interactions_framework/Modules/UtilityModule.cs +++ b/samples/InteractionFramework/Modules/GeneralModule.cs @@ -1,16 +1,11 @@ using Discord; using Discord.Interactions; -using Discord.WebSocket; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; -namespace _04_interactions_framework.Modules +namespace InteractionFramework.Modules { // Interation modules must be public and inherit from an IInterationModuleBase - public class UtilityModule : InteractionModuleBase + public class GeneralModule : InteractionModuleBase { // Dependencies can be accessed through Property injection, public properties with public setters will be set by the service provider public InteractionService Commands { get; set; } @@ -18,7 +13,7 @@ namespace _04_interactions_framework.Modules private CommandHandler _handler; // Constructor injection is also a valid way to access the dependecies - public UtilityModule ( CommandHandler handler ) + public GeneralModule(CommandHandler handler) { _handler = handler; } @@ -65,7 +60,7 @@ namespace _04_interactions_framework.Modules // Message Commands can only have one parameter, which must be a type of SocketMessage [MessageCommand("Delete")] - [RequireOwner] + [Attributes.RequireOwner] public async Task DeleteMesage(IMessage message) { await message.DeleteAsync(); diff --git a/samples/InteractionFramework/Modules/MessageCommandModule.cs b/samples/InteractionFramework/Modules/MessageCommandModule.cs new file mode 100644 index 000000000..d07d276f5 --- /dev/null +++ b/samples/InteractionFramework/Modules/MessageCommandModule.cs @@ -0,0 +1,30 @@ +using Discord; +using Discord.Interactions; +using Discord.WebSocket; +using System.Threading.Tasks; + +namespace InteractionFramework.Modules +{ + // A transient module for executing commands. This module will NOT keep any information after the command is executed. + internal class MessageCommandModule : InteractionModuleBase> + { + // Pins a message in the channel it is in. + [MessageCommand("pin")] + public async Task PinMessageAsync(IMessage message) + { + // make a safety cast to check if the message is ISystem- or IUserMessage + if (message is not IUserMessage userMessage) + await RespondAsync(text: ":x: You cant pin system messages!"); + + // if the pins in this channel are equal to or above 50, no more messages can be pinned. + else if ((await Context.Channel.GetPinnedMessagesAsync()).Count >= 50) + await RespondAsync(text: ":x: You cant pin any more messages, the max has already been reached in this channel!"); + + else + { + await userMessage.PinAsync(); + await RespondAsync(":white_check_mark: Successfully pinned message!"); + } + } + } +} diff --git a/samples/InteractionFramework/Modules/SlashCommandModule.cs b/samples/InteractionFramework/Modules/SlashCommandModule.cs new file mode 100644 index 000000000..a066ea18c --- /dev/null +++ b/samples/InteractionFramework/Modules/SlashCommandModule.cs @@ -0,0 +1,51 @@ +using Discord; +using Discord.Interactions; +using Discord.WebSocket; +using System; +using System.Threading.Tasks; + +namespace InteractionFramework.Modules +{ + public enum Hobby + { + Gaming, + + Art, + + Reading + } + + // A transient module for executing commands. This module will NOT keep any information after the command is executed. + class SlashCommandModule : InteractionModuleBase> + { + // Will be called before execution. Here you can populate several entities you may want to retrieve before executing a command. + // I.E. database objects + public override void BeforeExecute(ICommandInfo command) + { + // Anything + throw new NotImplementedException(); + } + + // Will be called after execution + public override void AfterExecute(ICommandInfo command) + { + // Anything + throw new NotImplementedException(); + } + + [SlashCommand("ping", "Pings the bot and returns its latency.")] + public async Task GreetUserAsync() + => await RespondAsync(text: $":ping_pong: It took me {Context.Client.Latency}ms to respond to you!", ephemeral: true); + + [SlashCommand("hobby", "Choose your hobby from the list!")] + public async Task ChooseAsync(Hobby hobby) + => await RespondAsync(text: $":thumbsup: Your hobby is: {hobby}."); + + [SlashCommand("bitrate", "Gets the bitrate of a specific voice channel.")] + public async Task GetBitrateAsync([ChannelTypes(ChannelType.Voice, ChannelType.Stage)] IChannel channel) + { + var voiceChannel = channel as IVoiceChannel; + await RespondAsync(text: $"This voice channel has a bitrate of {voiceChannel.Bitrate}"); + } + } +} diff --git a/samples/InteractionFramework/Modules/UserCommandModule.cs b/samples/InteractionFramework/Modules/UserCommandModule.cs new file mode 100644 index 000000000..60c5246ce --- /dev/null +++ b/samples/InteractionFramework/Modules/UserCommandModule.cs @@ -0,0 +1,17 @@ +using Discord; +using Discord.Interactions; +using Discord.WebSocket; +using System.Threading.Tasks; + +namespace InteractionFramework.Modules +{ + // A transient module for executing commands. This module will NOT keep any information after the command is executed. + class UserCommandModule : InteractionModuleBase> + { + // This command will greet target user in the channel this was executed in. + [UserCommand("greet")] + public async Task GreetUserAsync(IUser user) + => await RespondAsync(text: $":wave: {Context.User} said hi to you, <@{user.Id}>!"); + } +} + diff --git a/samples/04_interactions_framework/Program.cs b/samples/InteractionFramework/Program.cs similarity index 96% rename from samples/04_interactions_framework/Program.cs rename to samples/InteractionFramework/Program.cs index 5dedbfae9..49db29714 100644 --- a/samples/04_interactions_framework/Program.cs +++ b/samples/InteractionFramework/Program.cs @@ -4,14 +4,14 @@ using Discord.WebSocket; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using System; -using System.Reflection; using System.Threading; using System.Threading.Tasks; -namespace _04_interactions_framework +namespace InteractionFramework { class Program { + // Entry point of the program. static void Main ( string[] args ) { // One of the more flexable ways to access the configuration data is to use the Microsoft's Configuration model, @@ -24,7 +24,7 @@ namespace _04_interactions_framework RunAsync(config).GetAwaiter().GetResult(); } - static async Task RunAsync (IConfiguration configuration ) + static async Task RunAsync (IConfiguration configuration) { // Dependency injection is a key part of the Interactions framework but it needs to be disposed at the end of the app's lifetime. using var services = ConfigureServices(configuration); @@ -64,14 +64,12 @@ namespace _04_interactions_framework } static ServiceProvider ConfigureServices ( IConfiguration configuration ) - { - return new ServiceCollection() + => new ServiceCollection() .AddSingleton(configuration) .AddSingleton() .AddSingleton(x => new InteractionService(x.GetRequiredService())) .AddSingleton() .BuildServiceProvider(); - } static bool IsDebug ( ) { diff --git a/samples/04_interactions_framework/04_interactions_framework.csproj b/samples/InteractionFramework/_InteractionFramework.csproj similarity index 94% rename from samples/04_interactions_framework/04_interactions_framework.csproj rename to samples/InteractionFramework/_InteractionFramework.csproj index 780ab69bd..f11c2bd3d 100644 --- a/samples/04_interactions_framework/04_interactions_framework.csproj +++ b/samples/InteractionFramework/_InteractionFramework.csproj @@ -3,7 +3,7 @@ Exe net5.0 - _04_interactions_framework + InteractionFramework diff --git a/samples/ShardedClient/Modules/InteractionModule.cs b/samples/ShardedClient/Modules/InteractionModule.cs new file mode 100644 index 000000000..089328e7d --- /dev/null +++ b/samples/ShardedClient/Modules/InteractionModule.cs @@ -0,0 +1,18 @@ +using Discord.Interactions; +using Discord.WebSocket; +using System.Threading.Tasks; + +namespace ShardedClient.Modules +{ + // A display of portability, which shows how minimal the difference between the 2 frameworks is. + public class InteractionModule : InteractionModuleBase> + { + [SlashCommand("info", "Information about this shard.")] + public async Task InfoAsync() + { + var msg = $@"Hi {Context.User}! There are currently {Context.Client.Shards.Count} shards! + This guild is being served by shard number {Context.Client.GetShardFor(Context.Guild).ShardId}"; + await RespondAsync(msg); + } + } +} diff --git a/samples/03_sharded_client/Modules/PublicModule.cs b/samples/ShardedClient/Modules/PublicModule.cs similarity index 93% rename from samples/03_sharded_client/Modules/PublicModule.cs rename to samples/ShardedClient/Modules/PublicModule.cs index fad2ba98c..25aa88aaf 100644 --- a/samples/03_sharded_client/Modules/PublicModule.cs +++ b/samples/ShardedClient/Modules/PublicModule.cs @@ -1,7 +1,7 @@ -using System.Threading.Tasks; using Discord.Commands; +using System.Threading.Tasks; -namespace _03_sharded_client.Modules +namespace ShardedClient.Modules { // Remember to make your module reference the ShardedCommandContext public class PublicModule : ModuleBase diff --git a/samples/03_sharded_client/Program.cs b/samples/ShardedClient/Program.cs similarity index 83% rename from samples/03_sharded_client/Program.cs rename to samples/ShardedClient/Program.cs index 753f400a1..717ce1d80 100644 --- a/samples/03_sharded_client/Program.cs +++ b/samples/ShardedClient/Program.cs @@ -1,13 +1,14 @@ -using System; -using System.Threading; -using System.Threading.Tasks; -using _03_sharded_client.Services; using Discord; using Discord.Commands; +using Discord.Interactions; using Discord.WebSocket; using Microsoft.Extensions.DependencyInjection; +using ShardedClient.Services; +using System; +using System.Threading; +using System.Threading.Tasks; -namespace _03_sharded_client +namespace ShardedClient { // This is a minimal example of using Discord.Net's Sharded Client // The provided DiscordShardedClient class simplifies having multiple @@ -15,7 +16,11 @@ namespace _03_sharded_client class Program { static void Main(string[] args) - => new Program().MainAsync().GetAwaiter().GetResult(); + => new Program() + .MainAsync() + .GetAwaiter() + .GetResult(); + public async Task MainAsync() { // You specify the amount of shards you'd like to have with the @@ -40,6 +45,7 @@ namespace _03_sharded_client client.ShardReady += ReadyAsync; client.Log += LogAsync; + await services.GetRequiredService().InitializeAsync(); await services.GetRequiredService().InitializeAsync(); // Tokens should be considered secret data, and never hard-coded. @@ -51,13 +57,13 @@ namespace _03_sharded_client } private ServiceProvider ConfigureServices(DiscordSocketConfig config) - { - return new ServiceCollection() + => new ServiceCollection() .AddSingleton(new DiscordShardedClient(config)) .AddSingleton() + .AddSingleton(x => new InteractionService(x.GetRequiredService())) .AddSingleton() + .AddSingleton() .BuildServiceProvider(); - } private Task ReadyAsync(DiscordSocketClient shard) diff --git a/samples/03_sharded_client/Services/CommandHandlingService.cs b/samples/ShardedClient/Services/CommandHandlingService.cs similarity index 95% rename from samples/03_sharded_client/Services/CommandHandlingService.cs rename to samples/ShardedClient/Services/CommandHandlingService.cs index adc91b12c..796188050 100644 --- a/samples/03_sharded_client/Services/CommandHandlingService.cs +++ b/samples/ShardedClient/Services/CommandHandlingService.cs @@ -1,12 +1,12 @@ -using System; -using System.Reflection; -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; using Discord; using Discord.Commands; using Discord.WebSocket; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Reflection; +using System.Threading.Tasks; -namespace _03_sharded_client.Services +namespace ShardedClient.Services { public class CommandHandlingService { @@ -33,7 +33,7 @@ namespace _03_sharded_client.Services public async Task MessageReceivedAsync(SocketMessage rawMessage) { // Ignore system messages, or messages from other bots - if (!(rawMessage is SocketUserMessage message)) + if (rawMessage is not SocketUserMessage message) return; if (message.Source != MessageSource.User) return; @@ -59,7 +59,7 @@ namespace _03_sharded_client.Services return; // the command failed, let's notify the user that something happened. - await context.Channel.SendMessageAsync($"error: {result.ToString()}"); + await context.Channel.SendMessageAsync($"error: {result}"); } private Task LogAsync(LogMessage log) diff --git a/samples/ShardedClient/Services/InteractionHandlingService.cs b/samples/ShardedClient/Services/InteractionHandlingService.cs new file mode 100644 index 000000000..59b479361 --- /dev/null +++ b/samples/ShardedClient/Services/InteractionHandlingService.cs @@ -0,0 +1,57 @@ +using Discord; +using Discord.Interactions; +using Discord.WebSocket; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Linq; +using System.Threading.Tasks; + +namespace ShardedClient.Services +{ + public class InteractionHandlingService + { + private readonly InteractionService _service; + private readonly DiscordShardedClient _client; + private readonly IServiceProvider _provider; + + public InteractionHandlingService(IServiceProvider services) + { + _service = services.GetRequiredService(); + _client = services.GetRequiredService(); + _provider = services; + + _service.Log += LogAsync; + _client.InteractionCreated += OnInteractionAsync; + // For examples on how to handle post execution, + // see the InteractionFramework samples. + } + + // Register all modules, and add the commands from these modules to either guild or globally depending on the build state. + public async Task InitializeAsync() + { + await _service.AddModulesAsync(typeof(InteractionHandlingService).Assembly, _provider); +#if DEBUG + await _service.AddCommandsToGuildAsync(_client.Guilds.First(x => x.Id == 1)); +#else + await _service.AddCommandsGloballyAsync(); +#endif + } + + private async Task OnInteractionAsync(SocketInteraction interaction) + { + _ = Task.Run(async () => + { + var context = new ShardedInteractionContext(_client, interaction); + await _service.ExecuteCommandAsync(context, _provider); + }); + await Task.CompletedTask; + } + + private Task LogAsync(LogMessage log) + { + Console.WriteLine(log.ToString()); + + return Task.CompletedTask; + } + } +} diff --git a/samples/03_sharded_client/03_sharded_client.csproj b/samples/ShardedClient/_ShardedClient.csproj similarity index 76% rename from samples/03_sharded_client/03_sharded_client.csproj rename to samples/ShardedClient/_ShardedClient.csproj index c4c42516e..69576ea27 100644 --- a/samples/03_sharded_client/03_sharded_client.csproj +++ b/samples/ShardedClient/_ShardedClient.csproj @@ -3,7 +3,7 @@ Exe net5.0 - _03_sharded_client + ShardedClient @@ -12,6 +12,7 @@ + diff --git a/samples/02_commands_framework/Modules/PublicModule.cs b/samples/TextCommandFramework/Modules/PublicModule.cs similarity index 96% rename from samples/02_commands_framework/Modules/PublicModule.cs rename to samples/TextCommandFramework/Modules/PublicModule.cs index 18423f609..68534e826 100644 --- a/samples/02_commands_framework/Modules/PublicModule.cs +++ b/samples/TextCommandFramework/Modules/PublicModule.cs @@ -1,10 +1,10 @@ -using System.IO; -using System.Threading.Tasks; using Discord; using Discord.Commands; -using _02_commands_framework.Services; +using System.IO; +using System.Threading.Tasks; +using TextCommandFramework.Services; -namespace _02_commands_framework.Modules +namespace TextCommandFramework.Modules { // Modules must be public and inherit from an IModuleBase public class PublicModule : ModuleBase diff --git a/samples/02_commands_framework/Program.cs b/samples/TextCommandFramework/Program.cs similarity index 97% rename from samples/02_commands_framework/Program.cs rename to samples/TextCommandFramework/Program.cs index 8a2f37dce..8a18daf72 100644 --- a/samples/02_commands_framework/Program.cs +++ b/samples/TextCommandFramework/Program.cs @@ -1,14 +1,14 @@ +using Discord; +using Discord.Commands; +using Discord.WebSocket; +using Microsoft.Extensions.DependencyInjection; using System; using System.Net.Http; using System.Threading; using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using Discord; -using Discord.WebSocket; -using Discord.Commands; -using _02_commands_framework.Services; +using TextCommandFramework.Services; -namespace _02_commands_framework +namespace TextCommandFramework { // This is a minimal example of using Discord.Net's command // framework - by no means does it show everything the framework diff --git a/samples/02_commands_framework/Services/CommandHandlingService.cs b/samples/TextCommandFramework/Services/CommandHandlingService.cs similarity index 92% rename from samples/02_commands_framework/Services/CommandHandlingService.cs rename to samples/TextCommandFramework/Services/CommandHandlingService.cs index 5ec496f78..5dd480424 100644 --- a/samples/02_commands_framework/Services/CommandHandlingService.cs +++ b/samples/TextCommandFramework/Services/CommandHandlingService.cs @@ -1,12 +1,12 @@ -using System; -using System.Reflection; -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; using Discord; using Discord.Commands; using Discord.WebSocket; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Reflection; +using System.Threading.Tasks; -namespace _02_commands_framework.Services +namespace TextCommandFramework.Services { public class CommandHandlingService { @@ -36,21 +36,24 @@ namespace _02_commands_framework.Services public async Task MessageReceivedAsync(SocketMessage rawMessage) { // Ignore system messages, or messages from other bots - if (!(rawMessage is SocketUserMessage message)) return; - if (message.Source != MessageSource.User) return; + if (!(rawMessage is SocketUserMessage message)) + return; + if (message.Source != MessageSource.User) + return; // This value holds the offset where the prefix ends var argPos = 0; // Perform prefix check. You may want to replace this with // (!message.HasCharPrefix('!', ref argPos)) // for a more traditional command format like !help. - if (!message.HasMentionPrefix(_discord.CurrentUser, ref argPos)) return; + if (!message.HasMentionPrefix(_discord.CurrentUser, ref argPos)) + return; var context = new SocketCommandContext(_discord, message); // Perform the execution of the command. In this method, // the command service will perform precondition and parsing check // then execute the command if one is matched. - await _commands.ExecuteAsync(context, argPos, _services); + await _commands.ExecuteAsync(context, argPos, _services); // Note that normally a result will be returned by this format, but here // we will handle the result in CommandExecutedAsync, } diff --git a/samples/02_commands_framework/Services/PictureService.cs b/samples/TextCommandFramework/Services/PictureService.cs similarity index 91% rename from samples/02_commands_framework/Services/PictureService.cs rename to samples/TextCommandFramework/Services/PictureService.cs index dda818cc3..5c8e1dd89 100644 --- a/samples/02_commands_framework/Services/PictureService.cs +++ b/samples/TextCommandFramework/Services/PictureService.cs @@ -2,7 +2,7 @@ using System.IO; using System.Net.Http; using System.Threading.Tasks; -namespace _02_commands_framework.Services +namespace TextCommandFramework.Services { public class PictureService { diff --git a/samples/02_commands_framework/02_commands_framework.csproj b/samples/TextCommandFramework/_TextCommandFramework.csproj similarity index 90% rename from samples/02_commands_framework/02_commands_framework.csproj rename to samples/TextCommandFramework/_TextCommandFramework.csproj index 30c25e846..ee64205f5 100644 --- a/samples/02_commands_framework/02_commands_framework.csproj +++ b/samples/TextCommandFramework/_TextCommandFramework.csproj @@ -3,6 +3,7 @@ Exe net5.0 + TextCommandFramework diff --git a/samples/04_webhook_client/Program.cs b/samples/WebhookClient/Program.cs similarity index 97% rename from samples/04_webhook_client/Program.cs rename to samples/WebhookClient/Program.cs index f3a50036c..7b2539302 100644 --- a/samples/04_webhook_client/Program.cs +++ b/samples/WebhookClient/Program.cs @@ -2,7 +2,7 @@ using Discord; using Discord.Webhook; using System.Threading.Tasks; -namespace _04_webhook_client +namespace WebHookClient { // This is a minimal example of using Discord.Net's Webhook Client // Webhooks are send-only components of Discord that allow you to make a POST request diff --git a/samples/04_webhook_client/04_webhook_client.csproj b/samples/WebhookClient/_WebhookClient.csproj similarity index 69% rename from samples/04_webhook_client/04_webhook_client.csproj rename to samples/WebhookClient/_WebhookClient.csproj index c8d0c9ad3..91131894d 100644 --- a/samples/04_webhook_client/04_webhook_client.csproj +++ b/samples/WebhookClient/_WebhookClient.csproj @@ -2,8 +2,8 @@ Exe - netcoreapp2.2 - _04_webhook_client + net5.0 + WebHookClient diff --git a/samples/_idn/Inspector.cs b/samples/_idn/Inspector.cs new file mode 100644 index 000000000..1544c8d07 --- /dev/null +++ b/samples/_idn/Inspector.cs @@ -0,0 +1,74 @@ +using System.Collections; +using System.Linq; +using System.Reflection; +using System.Text; + +namespace Idn +{ + public static class Inspector + { + public static string Inspect(object value) + { + var builder = new StringBuilder(); + if (value != null) + { + var type = value.GetType().GetTypeInfo(); + builder.AppendLine($"[{type.Namespace}.{type.Name}]"); + builder.AppendLine($"{InspectProperty(value)}"); + + if (value is IEnumerable) + { + var items = (value as IEnumerable).Cast().ToArray(); + if (items.Length > 0) + { + builder.AppendLine(); + foreach (var item in items) + builder.AppendLine($"- {InspectProperty(item)}"); + } + } + else + { + var groups = type.GetProperties(BindingFlags.Instance | BindingFlags.Public) + .Where(x => x.GetIndexParameters().Length == 0) + .GroupBy(x => x.Name) + .OrderBy(x => x.Key) + .ToArray(); + if (groups.Length > 0) + { + builder.AppendLine(); + int pad = groups.Max(x => x.Key.Length) + 1; + foreach (var group in groups) + builder.AppendLine($"{group.Key.PadRight(pad, ' ')}{InspectProperty(group.First().GetValue(value))}"); + } + } + } + else + builder.AppendLine("null"); + return builder.ToString(); + } + + private static string InspectProperty(object obj) + { + if (obj == null) + return "null"; + + var type = obj.GetType(); + + var debuggerDisplay = type.GetProperty("DebuggerDisplay", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + if (debuggerDisplay != null) + return debuggerDisplay.GetValue(obj).ToString(); + + var toString = type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) + .Where(x => x.Name == "ToString" && x.DeclaringType != typeof(object)) + .FirstOrDefault(); + if (toString != null) + return obj.ToString(); + + var count = type.GetProperty("Count", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + if (count != null) + return $"[{count.GetValue(obj)} Items]"; + + return obj.ToString(); + } + } +} diff --git a/samples/_idn/Program.cs b/samples/_idn/Program.cs new file mode 100644 index 000000000..aab9924f9 --- /dev/null +++ b/samples/_idn/Program.cs @@ -0,0 +1,152 @@ +using Discord; +using Discord.WebSocket; +using Microsoft.CodeAnalysis.CSharp.Scripting; +using Microsoft.CodeAnalysis.Scripting; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Idn +{ + public class Program + { + public static readonly string[] Imports = + { + "System", + "System.Collections.Generic", + "System.Linq", + "System.Threading.Tasks", + "System.Diagnostics", + "System.IO", + "Discord", + "Discord.Rest", + "Discord.WebSocket", + "idn" + }; + + static async Task Main(string[] args) + { + var token = File.ReadAllText("token.ignore"); + var client = new DiscordSocketClient(new DiscordSocketConfig { LogLevel = LogSeverity.Debug }); + var logQueue = new ConcurrentQueue(); + var logCancelToken = new CancellationTokenSource(); + int presenceUpdates = 0; + + client.Log += msg => + { + logQueue.Enqueue(msg); + return Task.CompletedTask; + }; + Console.CancelKeyPress += (_ev, _s) => + { + logCancelToken.Cancel(); + }; + + var logTask = Task.Run(async () => + { + var fs = new FileStream("idn.log", FileMode.Append); + var logStringBuilder = new StringBuilder(200); + string logString = ""; + + byte[] helloBytes = Encoding.UTF8.GetBytes($"### new log session: {DateTime.Now} ###\n\n"); + await fs.WriteAsync(helloBytes); + + while (!logCancelToken.IsCancellationRequested) + { + if (logQueue.TryDequeue(out var msg)) + { + if (msg.Message?.IndexOf("PRESENCE_UPDATE)") > 0) + { + presenceUpdates++; + continue; + } + + _ = msg.ToString(builder: logStringBuilder); + logStringBuilder.AppendLine(); + logString = logStringBuilder.ToString(); + + Debug.Write(logString, "DNET"); + await fs.WriteAsync(Encoding.UTF8.GetBytes(logString)); + } + await fs.FlushAsync(); + try + { + await Task.Delay(100, logCancelToken.Token); + } + finally { } + } + + byte[] goodbyeBytes = Encoding.UTF8.GetBytes($"#!! end log session: {DateTime.Now} !!#\n\n\n"); + await fs.WriteAsync(goodbyeBytes); + await fs.DisposeAsync(); + }); + + await client.LoginAsync(TokenType.Bot, token); + await client.StartAsync(); + + var options = ScriptOptions.Default + .AddReferences(GetAssemblies().ToArray()) + .AddImports(Imports); + + var globals = new ScriptGlobals + { + Client = client, + PUCount = -1, + }; + + while (true) + { + Console.Write("> "); + string input = Console.ReadLine(); + + if (input == "quit!") + { + break; + } + + object eval; + try + { + globals.PUCount = presenceUpdates; + eval = await CSharpScript.EvaluateAsync(input, options, globals); + } + catch (Exception e) + { + eval = e; + } + Console.WriteLine(Inspector.Inspect(eval)); + } + + await client.StopAsync(); + client.Dispose(); + logCancelToken.Cancel(); + try + { await logTask; } + finally { Console.WriteLine("goodbye!"); } + } + + static IEnumerable GetAssemblies() + { + var Assemblies = Assembly.GetEntryAssembly().GetReferencedAssemblies(); + foreach (var a in Assemblies) + { + var asm = Assembly.Load(a); + yield return asm; + } + yield return Assembly.GetEntryAssembly(); + } + + public class ScriptGlobals + { + public DiscordSocketClient Client { get; set; } + public int PUCount { get; set; } + } + } +} diff --git a/samples/_idn/idn.csproj b/samples/_idn/idn.csproj new file mode 100644 index 000000000..fafb3df3f --- /dev/null +++ b/samples/_idn/idn.csproj @@ -0,0 +1,16 @@ + + + + Exe + net5.0 + + + + + + + + + + + diff --git a/samples/_idn/logview.ps1 b/samples/_idn/logview.ps1 new file mode 100644 index 000000000..0857475f5 --- /dev/null +++ b/samples/_idn/logview.ps1 @@ -0,0 +1 @@ +Get-Content .\bin\Debug\netcoreapp3.1\idn.log -Tail 3 -Wait \ No newline at end of file diff --git a/samples/idn/Program.cs b/samples/idn/Program.cs index abc315a2d..aab9924f9 100644 --- a/samples/idn/Program.cs +++ b/samples/idn/Program.cs @@ -1,17 +1,17 @@ +using Discord; +using Discord.WebSocket; +using Microsoft.CodeAnalysis.CSharp.Scripting; +using Microsoft.CodeAnalysis.Scripting; using System; +using System.Collections.Concurrent; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; -using System.Threading.Tasks; -using Microsoft.CodeAnalysis.CSharp.Scripting; -using Microsoft.CodeAnalysis.Scripting; -using Discord; -using Discord.WebSocket; -using System.Collections.Concurrent; -using System.Threading; using System.Text; -using System.Diagnostics; +using System.Threading; +using System.Threading.Tasks; namespace Idn { diff --git a/src/Discord.Net.Examples/Core/Entities/Channels/IGuildChannel.Examples.cs b/src/Discord.Net.Examples/Core/Entities/Channels/IGuildChannel.Examples.cs index d382ddbf3..8205ad50f 100644 --- a/src/Discord.Net.Examples/Core/Entities/Channels/IGuildChannel.Examples.cs +++ b/src/Discord.Net.Examples/Core/Entities/Channels/IGuildChannel.Examples.cs @@ -1,6 +1,6 @@ +using JetBrains.Annotations; using System; using System.Threading.Tasks; -using JetBrains.Annotations; namespace Discord.Net.Examples.Core.Entities.Channels { @@ -11,8 +11,10 @@ namespace Discord.Net.Examples.Core.Entities.Channels public async Task MuteRoleAsync(IRole role, IGuildChannel channel) { - if (role == null) throw new ArgumentNullException(nameof(role)); - if (channel == null) throw new ArgumentNullException(nameof(channel)); + if (role == null) + throw new ArgumentNullException(nameof(role)); + if (channel == null) + throw new ArgumentNullException(nameof(channel)); // Fetches the previous overwrite and bail if one is found var previousOverwrite = channel.GetPermissionOverwrite(role); @@ -29,8 +31,10 @@ namespace Discord.Net.Examples.Core.Entities.Channels public async Task MuteUserAsync(IGuildUser user, IGuildChannel channel) { - if (user == null) throw new ArgumentNullException(nameof(user)); - if (channel == null) throw new ArgumentNullException(nameof(channel)); + if (user == null) + throw new ArgumentNullException(nameof(user)); + if (channel == null) + throw new ArgumentNullException(nameof(channel)); // Fetches the previous overwrite and bail if one is found var previousOverwrite = channel.GetPermissionOverwrite(user); diff --git a/src/Discord.Net.Examples/Core/Entities/Channels/IMessageChannel.Examples.cs b/src/Discord.Net.Examples/Core/Entities/Channels/IMessageChannel.Examples.cs index d920e9710..9b4aee53c 100644 --- a/src/Discord.Net.Examples/Core/Entities/Channels/IMessageChannel.Examples.cs +++ b/src/Discord.Net.Examples/Core/Entities/Channels/IMessageChannel.Examples.cs @@ -1,8 +1,8 @@ +using JetBrains.Annotations; using System; using System.Linq; using System.Net.Http; using System.Threading.Tasks; -using JetBrains.Annotations; namespace Discord.Net.Examples.Core.Entities.Channels { @@ -90,7 +90,7 @@ namespace Discord.Net.Examples.Core.Entities.Channels #region SendFileAsync.FilePath.EmbeddedImage await channel.SendFileAsync("b1nzy.jpg", - embed: new EmbedBuilder {ImageUrl = "attachment://b1nzy.jpg"}.Build()); + embed: new EmbedBuilder { ImageUrl = "attachment://b1nzy.jpg" }.Build()); #endregion @@ -99,13 +99,14 @@ namespace Discord.Net.Examples.Core.Entities.Channels using (var b1nzyStream = await httpClient.GetStreamAsync("https://example.com/b1nzy")) await channel.SendFileAsync(b1nzyStream, "b1nzy.jpg", - embed: new EmbedBuilder {ImageUrl = "attachment://b1nzy.jpg"}.Build()); + embed: new EmbedBuilder { ImageUrl = "attachment://b1nzy.jpg" }.Build()); #endregion #region EnterTypingState - using (channel.EnterTypingState()) await LongRunningAsync(); + using (channel.EnterTypingState()) + await LongRunningAsync(); #endregion } diff --git a/src/Discord.Net.Examples/Core/Entities/Users/IUser.Examples.cs b/src/Discord.Net.Examples/Core/Entities/Users/IUser.Examples.cs index 83daedaa0..5a6712901 100644 --- a/src/Discord.Net.Examples/Core/Entities/Users/IUser.Examples.cs +++ b/src/Discord.Net.Examples/Core/Entities/Users/IUser.Examples.cs @@ -1,7 +1,7 @@ +using JetBrains.Annotations; using System; using System.Net; using System.Threading.Tasks; -using JetBrains.Annotations; namespace Discord.Net.Examples.Core.Entities.Users { diff --git a/src/Discord.Net.Examples/WebSocket/BaseSocketClient.Events.Examples.cs b/src/Discord.Net.Examples/WebSocket/BaseSocketClient.Events.Examples.cs index 27d393c07..57c9dcd04 100644 --- a/src/Discord.Net.Examples/WebSocket/BaseSocketClient.Events.Examples.cs +++ b/src/Discord.Net.Examples/WebSocket/BaseSocketClient.Events.Examples.cs @@ -1,8 +1,8 @@ +using Discord.WebSocket; +using JetBrains.Annotations; using System; using System.Linq; using System.Threading.Tasks; -using Discord.WebSocket; -using JetBrains.Annotations; namespace Discord.Net.Examples.WebSocket { @@ -74,7 +74,7 @@ namespace Discord.Net.Examples.WebSocket #region MessageReceived - private readonly ulong[] _targetUserIds = {168693960628371456, 53905483156684800}; + private readonly ulong[] _targetUserIds = { 168693960628371456, 53905483156684800 }; public void HookMessageReceived(BaseSocketClient client) => client.MessageReceived += HandleMessageReceived; @@ -82,9 +82,11 @@ namespace Discord.Net.Examples.WebSocket public Task HandleMessageReceived(SocketMessage message) { // check if the message is a user message as opposed to a system message (e.g. Clyde, pins, etc.) - if (!(message is SocketUserMessage userMessage)) return Task.CompletedTask; + if (!(message is SocketUserMessage userMessage)) + return Task.CompletedTask; // check if the message origin is a guild message channel - if (!(userMessage.Channel is SocketTextChannel textChannel)) return Task.CompletedTask; + if (!(userMessage.Channel is SocketTextChannel textChannel)) + return Task.CompletedTask; // check if the target user was mentioned var targetUsers = userMessage.MentionedUsers.Where(x => _targetUserIds.Contains(x.Id)); foreach (var targetUser in targetUsers) @@ -103,7 +105,8 @@ namespace Discord.Net.Examples.WebSocket public async Task HandleMessageDelete(Cacheable cachedMessage, Cacheable cachedChannel) { // check if the message exists in cache; if not, we cannot report what was removed - if (!cachedMessage.HasValue) return; + if (!cachedMessage.HasValue) + return; // gets or downloads the channel if it's not in the cache IMessageChannel channel = await cachedChannel.GetOrDownloadAsync(); var message = cachedMessage.Value;