From ff0fea98a65d907fbce07856f1a9ef4aebb9108b Mon Sep 17 00:00:00 2001 From: Still Hsu <341464@gmail.com> Date: Mon, 1 Oct 2018 05:44:33 +0800 Subject: [PATCH] Documentation Overhaul (#1161) * Add XML docs * Clean up style switcher * Squash commits on branch docs/faq-n-patches * Fix broken theme selector * Add local image embed instruction * Add a bunch of XML docs * Add a bunch of XML docs * Fix broken search + DocFX by default ships with an older version of jQuery, switching to a newer version confuses parts of the DocFX Javascript. * Minor fixes for CONTRIBUTING.md and README.md * Clean up filterConfig.yml + New config exposes Discord.Net namespace since it has several common public exceptions that may be helpful to users * Add XML docs * Read token from Environment Variable instead of hardcode * Add XMLDocs * Compress some assets & add OAuth2 URL generator * Fix sample link & add missing pictures * Add tag examples * Fix embed docs consistency * Add details regarding userbot support * Add XML Docs * Add XML Docs * Add XML Docs * Minor fixes in documentations + Fix unescaped '<' + Fix typo * Fix seealso for preconditions and add missing descriptions * Add missing exceptions * Document exposed TypeReaders * Fix letter-casing for files * Add 'last modified' plugin Source: https://github.com/Still34/DocFx.Plugin.LastModified Licensed under MIT License * XML Docs * Fix minor consistencies & redundant impl * Add properties examples to overwrite * Fix missing Username prop * Add warning for bulk-delete endpoint * Replace note block * Add BaseSocketClient docs * Add XML docs * Replace langword null to code block null instead - Because DocFX sucks at rendering langword * Replace all langword placements with code block * Add more IGuild docs * Add details to SpotifyGame * Initial proofread of the articles * Add explanation for RunMode * Add event docs - MessageReceived - ChannelUpdated/Destroyed/Created * Fix light theme link color * Fix xml docs error * Add partial documentation for audit log impl * Add documentation for some REST-based objects * Add partial documentation for audit log objects * Add more XML comments to quotation mark alias map stuff, including an example * Add reference to CommandServiceConfig from the util docs' * Add explanation that if " is removed then it wont work * Fix missing service provider in example * Add documentation for new INestedChannel * Add documentation * Add documentation for new API version & few events * Revise guide paragraphs/samples + Fix various formatting. + Provide a more detailed walkthrough for dependency injection. + Add C# note at intro. * Fix typos & formatting * Improve group module example * Small amount to see if I'm doing it right * Remove/cleanup redundant variables * Fix EnterTypingState impl for doc inheritance * Fix Test to resolve changes made in 15b58e * Improve precondition documentation + Add precondition usage sample + Add precondition group usage sample + Move precondition samples to its own sample folder * Move samples to individual folders * Clarify token source * Cleanup styling of README.md for docs * Replace InvalidPathChars for NS1.3 * InvalidPathChars does not exist in NS1.3; replaced with GetInvalidPathChars instead. * Add a missing change for 2c7cc738 * Update LastModified to v1.1.0 & add license * Rewrite installation page for Core 2.1 * Fix anchor link * Bump post-processor to v1.1.1 * Add fixes to partial file & add license * Moved theme-switcher code to scripts partial file + Add author's MIT license to featherlight javascript * Remove unused bootstrap plugin * Bump LastModified plugin * Changed the path from 'lastmodified' to 'last-modified' for consistency * Cleanup README & Contribution guide * Changes to last pr * Fix GetCategoryAsync docs * Proofread and cleanup articles * Change passive voice in "Get Started" to active * Fix improper preposition in Commands Introduction page * Fix minor grammar mistakes in "Your First Bot" (future tense -> present tense/subjunctive mood -> indicative mood/proper noun casing/incorrect noun/add missing article) * Fix minor grammar mistakes in "Installation" (missing article) * no hablo ingles * Try try try again * I'm sure you're having as much fun as I am * Cleanup TOC & fix titles * Improve styling + Change title font to Noto Sans + Add materialized design for commit message box * Add DescriptionGenerator plugin * Add nightly section for clarification * Fix typos in Nightlies & Post-execution * Bump DescriptionGenerator to v1.1.0 + This build adds the functionality of generating managed references' summary into the description tag. * Initial emoji article draft * Add 'additional information' section for emoji article * Add cosmetic changes to the master css * Alter info box color + Add transition to article content * Add clarification in the emoji article * Emphasize that normal emoji string will not translate to its Unicode representation. * Clean up or add some of the samples featured in the article. + Add emoji/emote declaration section for clarification. + Add WebSocket emote sample. - Remove inconsistent styling ('wacky memes' proves to be too out of place). * Improve readability for nightlies article * Move 'Bundled Preconditions' section * Bump LastModified to fix UTC DateTime parsing * Add langwordMapping.yml * Add XML docs * Add VSC workspace rule * The root workspace limits the ruler to 120 characters for member documentations and excludes folders such as 'samples' and 'docs'. * The docs workspace limits the ruler to 70 characters for standard conceptual article to comply with documentation's CONTRIBUTING.md rule, and excludes temprorary folders created by DocFX. * Update CONTRIBUTING.md * Add documentation style rule * Fix styling of several member documentation * Fix ' />' caused by Agent Smith oddities * Fix styling to be more specific about the mention of IDs * Fix exception summary to comply with official Microsoft Docs style * References https://docs.microsoft.com/en-us/dotnet/api/system.argumentnullexception?view=netframework-4.7.2 https://docs.microsoft.com/en-us/dotnet/api/system.platformnotsupportedexception?view=netframework-4.7.2 https://docs.microsoft.com/en-us/dotnet/api/system.badimageformatexception?view=netframework-4.7.2 * Add XML documentations * Shift color return docs * Fix minor docs * Added documentation for SocketDMChannel, SocketGuildChannel, and SocketTextChannel * Add XML docs * Corrections to SocketGuildChannel * Corrections to SocketTextChannel * Corrections to SocketDMChannel * Swapped out 'id' for 'snowflake identifier * Swapped out 'id' for 'snowflake identifier' * SocketDMChannel amendments * SocketGuildChannel amendments * SocketTextChannel amendments * Add XML docs & patch return types + Starting from this commit, all return types for tasks will use style similar to most documentations featured on docs.microsoft.com References: https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.dbcontext.-ctor?view=efcore-2.1 https://docs.microsoft.com/en-us/dotnet/api/system.io.filestream.readasync?view=netcore-2.1 https://docs.microsoft.com/en-us/dotnet/api/system.io.textwriter.writelineasync?view=netcore-2.1#System_IO_TextWriter_WriteLineAsync_System_Char___ And many more other asynchronous method documentations featured in the latest BCL. * Added documentation for many audit log data types, fixed vowel indefinite articles * Change audit log data types to start with 'Contains' (verb) instead of an article * Fix some documentation issues and document some more audit log data types * Fix English posession * Add XML doc * Documented two more types * Documented RoleCreateAuditLogData * Document remaining audit log data types * Added RestDMChannel documentation * Added RestGuildChannel documentation * Added RestTextChannel documentation * Added RestVoiceChannel documentation * Added RestUser documentation * Added RestRole documentation * Added RestMessage documentation * Slightly better wording * Contains -> Contains a piece of (describe article) * [EN] Present perf. -> past perf. * Add XML docs * Fix arrow alignment * Clarify supported nullable type * Fixed a typo in ISnowflakeEntity * Added RestUser Documentation * Added RestInvite documentation * Add XML docs & minor optimizations * Minor optimization for doc rendering * Rollback font optimization changes * Amendments to RestUser * Added SocketDMChannel documentation * Added RestDMChannel documentation * Added RestGuild documentation * Adjustment to SocketDMChannel * Added minimal descriptions from the API documentation for Integration types * Added obsolete mention to the ReadMessages flag. * Added remarks about 2FA requirement for guild permissions * Added xmldoc for GuildPermission methods * Added xml doc for ToAllowList and ToDenyList * Added specification of how the bits of the color raw value are packed * Added discord API documentation to IConnection interface * I can spell :^) * Fix whitespace in ChannelPermission * fix spacing of values in guildpermission * Made changes to get field descriptions from feedback, added returns tag to IConnection * Added property get standard for IntegrationAccount * Added property get pattern to xml docs and identical returns tag. * Change all color class references to struct ...because it isn't a class. * Add XML docs * Rewrote the returns tags in IGuildIntegration, removed the ones I was unsure about. * Rewrote the rest of the returns tags * Amendments * Cleanup doc for c1d78189 * Added types to tags where missing * Added second sample for adding reactions * Added some class summaries * Missed a period * Amendments * restored the removed line break * Removed unnecessary see tag * Use consistent quotation marks around subscribers, the name for these users are dependant on the source of where they are integrated from (youtube or twitch), so we should not use a name that is specific to one platform * Add tag to the IGuildIntegration xmldocs * Fix grammar issue * Update DescriptionGenerator * Cleanup of https://github.com/Still34/Discord.Net/pull/8 * Cleanup previous PR * Fix for misleading behaviour in the emoji guide + Original lines stated that sending a emoji wrapped in colon will not be parsed, but that was incorrect; replaced with reactions instead of sending messages as the example * Add strings for dictionary in DotSettings * Add XML docs * Fix lots of typos in comments + Geez, I didn't know there were so many. * Add XML docs & rewrite GetMessagesAsync docs This commit rewrites the remarks section of GetMessagesAsync, as well as adding examples to several methods. * Update 'Your First Bot' + This commit reflects the new changes made to the Discord Application Developer Portal after its major update * Initial optimization for DocFX render & add missing files * Add examples in message methods * Cleanup https://github.com/RogueException/Discord.Net/pull/1128 * Fix first bot note * Cleanup FAQ structure * Add XML docs * Update docfx plugins * Fix navbar collapsing issue * Fix broken xref * Cleanup FAQ section + Add introductory paragraphs to each FAQ section. + Add 'missing dependency' entry to commands FAQ. * Split commands FAQ to 'General' and 'DI' sections. * Cleanup https://github.com/RogueException/Discord.Net/pull/1139 * Fix missing namespace * Add missing highlighting css for the light theme * Add additional clarification for installing packages * Add indentation to example for clarity * Cleanup several articles to be more human-friendly and easier to read * Remove RPC-related notes * Cleanup slow-mode-related documentation strings * Add an additional note about cross-guild emote usage * Add CreateTextChannel sample * Add XMLDocs --- .gitignore | 3 + CONTRIBUTING.md | 20 +- Discord.Net.code-workspace | 23 + Discord.Net.sln.DotSettings | 16 + docs/CONTRIBUTING.md | 39 +- docs/Discord.Net.Docs.code-workspace | 21 + docs/README.md | 19 +- .../Commands/CommandException.Overwrite.md | 31 + .../Commands/DontAutoLoadAttribute.Overwrite.md | 22 + .../Commands/DontInjectAttribute.Overwrite.md | 27 + .../Commands/ICommandContext.Inclusion.md | 5 + .../Commands/ICommandContext.Overwrite.md | 27 + .../Commands/PreconditionAttribute.Overwrites.md | 103 ++ .../PreconditionAttribute.Remarks.Inclusion.md | 6 + docs/_overwrites/Common/EmbedBuilder.Overwrites.md | 68 ++ .../Common/EmbedObjectBuilder.Inclusion.md | 25 + .../Common/EmbedObjectBuilder.Overwrites.md | 20 + docs/_overwrites/Common/IEmote.Inclusion.md | 26 + docs/_overwrites/Common/IEmote.Overwrites.md | 81 ++ .../Common/ObjectProperties.Overwrites.md | 174 ++++ .../OverrideTypeReaderAttribute.Overwrites.md | 24 + docs/_overwrites/Common/images/embed-example.png | Bin 0 -> 15290 bytes docs/_overwrites/Common/images/react-example.png | Bin 0 -> 8994 bytes .../plugins/DocFX.Plugin.DescriptionGenerator.dll | Bin 0 -> 9216 bytes .../description-generator/plugins/LICENSE | 21 + docs/_template/last-modified/plugins/LICENSE | 21 + .../plugins/LastModifiedPostProcessor.dll | Bin 0 -> 11776 bytes .../light-dark-theme/partials/affix.tmpl.partial | 33 + .../light-dark-theme/partials/head.tmpl.partial | 27 + .../light-dark-theme/partials/scripts.tmpl.partial | 10 + .../_template/light-dark-theme/styles/cornerify.js | 3 + docs/_template/light-dark-theme/styles/dark.css | 304 ++++++ .../styles/docfx.vendor.minify.css | 1022 ++++++++++++++++++++ docs/_template/light-dark-theme/styles/gray.css | 311 ++++++ docs/_template/light-dark-theme/styles/light.css | 113 +++ docs/_template/light-dark-theme/styles/master.css | 156 +++ .../light-dark-theme/styles/plugin-featherlight.js | 37 + .../light-dark-theme/styles/styleswitcher.js | 26 + .../light-dark-theme/styles/theme-switcher.css | 9 + .../_template/light-dark-theme/styles/tomorrow.css | 72 ++ docs/_template/light-dark-theme/styles/vs2015.css | 115 +++ docs/api/index.md | 19 +- docs/docfx.json | 96 +- docs/faq/basics/basic-operations.md | 123 +++ docs/faq/basics/client-basics.md | 66 ++ docs/faq/basics/getting-started.md | 79 ++ docs/faq/basics/images/dev-mode.png | Bin 0 -> 80742 bytes docs/faq/basics/images/mention-escape.png | Bin 0 -> 19611 bytes docs/faq/basics/images/snowflake.png | Bin 0 -> 73062 bytes docs/faq/basics/samples/cast.cs | 15 + docs/faq/basics/samples/emoji-others.cs | 18 + docs/faq/basics/samples/emoji-self.cs | 17 + docs/faq/commands/dependency-injection.md | 54 ++ docs/faq/commands/general.md | 142 +++ docs/faq/commands/samples/DI.cs | 28 + docs/faq/commands/samples/Remainder.cs | 20 + docs/faq/commands/samples/missing-dep.cs | 29 + docs/faq/commands/samples/runmode-cmdattrib.cs | 7 + docs/faq/commands/samples/runmode-cmdconfig.cs | 10 + docs/faq/misc/glossary.md | 82 ++ docs/faq/misc/legacy.md | 29 + docs/faq/toc.yml | 18 + docs/filterConfig.yml | 12 +- docs/guides/commands/commands.md | 343 ------- docs/guides/commands/dependency-injection.md | 47 + docs/guides/commands/intro.md | 221 +++++ docs/guides/commands/post-execution.md | 122 +++ docs/guides/commands/preconditions.md | 83 ++ docs/guides/commands/samples/command_handler.cs | 63 -- .../dependency-injection/dependency_map_setup.cs | 62 ++ .../dependency-injection/dependency_module.cs | 37 + .../dependency_module_noinject.cs | 29 + .../commands/samples/dependency_map_setup.cs | 18 - docs/guides/commands/samples/dependency_module.cs | 40 - docs/guides/commands/samples/empty-module.cs | 6 - .../commands/samples/intro/command_handler.cs | 63 ++ docs/guides/commands/samples/intro/empty-module.cs | 8 + docs/guides/commands/samples/{ => intro}/groups.cs | 15 +- docs/guides/commands/samples/{ => intro}/module.cs | 26 +- .../post-execution/command_exception_log.cs | 13 + .../post-execution/command_executed_adv_demo.cs | 13 + .../post-execution/command_executed_demo.cs | 38 + .../samples/post-execution/customresult_base.cs | 6 + .../post-execution/customresult_extended.cs | 10 + .../samples/post-execution/customresult_usage.cs | 10 + .../samples/post-execution/post-execution_basic.cs | 11 + .../samples/preconditions/group_precondition.cs | 9 + .../samples/preconditions/precondition_usage.cs | 3 + .../samples/{ => preconditions}/require_owner.cs | 10 +- .../samples/typereaders/typereader-register.cs | 29 + .../samples/{ => typereaders}/typereader.cs | 5 +- docs/guides/commands/typereaders.md | 70 ++ docs/guides/concepts/connections.md | 43 +- docs/guides/concepts/entities.md | 53 +- docs/guides/concepts/events.md | 36 +- docs/guides/concepts/logging.md | 39 +- docs/guides/concepts/samples/connections.cs | 2 +- docs/guides/concepts/samples/entities.cs | 8 +- docs/guides/concepts/samples/events.cs | 2 +- docs/guides/concepts/samples/logging.cs | 2 +- docs/guides/deployment/deployment.md | 86 ++ docs/guides/emoji/emoji.md | 100 ++ docs/guides/emoji/images/emojipedia.png | Bin 0 -> 15043 bytes docs/guides/emoji/images/emote-format.png | Bin 0 -> 14696 bytes docs/guides/emoji/images/fileformat-emoji-src.png | Bin 0 -> 23541 bytes docs/guides/emoji/samples/emoji-sample.cs | 6 + docs/guides/emoji/samples/emote-sample.cs | 7 + docs/guides/emoji/samples/socket-emote-sample.cs | 11 + docs/guides/getting_started/first-bot.md | 263 +++++ .../getting_started/images/appveyor-artifacts.png | Bin 0 -> 7002 bytes .../getting_started/images/appveyor-nupkg.png | Bin 0 -> 9412 bytes .../getting_started/images/install-vs-nuget.png | Bin 119670 -> 49542 bytes .../getting_started/images/intro-add-bot.png | Bin 26232 -> 6417 bytes .../getting_started/images/intro-authorize.png | Bin 0 -> 19052 bytes .../getting_started/images/intro-bot-settings.png | Bin 0 -> 5704 bytes .../getting_started/images/intro-client-id.png | Bin 5109 -> 0 bytes .../getting_started/images/intro-create-app.png | Bin 52035 -> 0 bytes .../getting_started/images/intro-create-bot.png | Bin 45743 -> 0 bytes .../images/intro-oauth-settings.png | Bin 0 -> 5655 bytes .../getting_started/images/intro-public-bot.png | Bin 0 -> 11135 bytes .../getting_started/images/intro-scopes-bot.png | Bin 0 -> 17423 bytes docs/guides/getting_started/images/intro-token.png | Bin 26594 -> 18552 bytes .../getting_started/images/nightlies-vs-note.png | Bin 0 -> 10162 bytes .../getting_started/images/nightlies-vs-step1.png | Bin 0 -> 13372 bytes .../getting_started/images/nightlies-vs-step2.png | Bin 0 -> 13713 bytes .../getting_started/images/nightlies-vs-step4.png | Bin 0 -> 8214 bytes docs/guides/getting_started/installing.md | 156 ++- docs/guides/getting_started/intro.md | 237 ----- docs/guides/getting_started/nightlies.md | 86 ++ .../samples/first-bot/async-context.cs | 9 + .../getting_started/samples/first-bot/client.cs | 21 + .../getting_started/samples/first-bot/complete.cs | 34 + .../getting_started/samples/first-bot/logging.cs | 5 + .../samples/{intro => first-bot}/message.cs | 2 +- .../samples/{intro => first-bot}/structure.cs | 0 .../getting_started/samples/intro/async-context.cs | 15 - .../guides/getting_started/samples/intro/client.cs | 17 - .../getting_started/samples/intro/complete.cs | 44 - .../getting_started/samples/intro/logging.cs | 22 - docs/guides/getting_started/samples/project.csproj | 13 - docs/guides/getting_started/samples/project.xml | 17 + docs/guides/getting_started/terminology.md | 40 +- docs/guides/introduction/intro.md | 54 ++ docs/guides/migrating/migrating.md | 61 -- docs/guides/migrating/samples/event.cs | 4 - docs/guides/migrating/samples/sync_event.cs | 5 - docs/guides/toc.yml | 42 +- docs/guides/voice/sending-voice.md | 5 +- docs/index.md | 31 +- docs/langwordMapping.yml | 61 ++ docs/toc.yml | 7 +- experiment/Discord.Net.Rpc/DiscordRpcApiClient.cs | 2 +- experiment/Discord.Net.Rpc/DiscordRpcConfig.cs | 4 +- .../Entities/Channels/RpcDMChannel.cs | 1 + .../Entities/Channels/RpcGroupChannel.cs | 1 + samples/01_basic_ping_bot/Program.cs | 6 +- samples/02_commands_framework/Program.cs | 2 +- .../Attributes/AliasAttribute.cs | 29 +- .../Attributes/CommandAttribute.cs | 15 + .../Attributes/DontAutoLoadAttribute.cs | 8 + .../Attributes/DontInjectAttribute.cs | 34 +- .../Attributes/GroupAttribute.cs | 11 + .../Attributes/NameAttribute.cs | 10 + .../Attributes/OverrideTypeReaderAttribute.cs | 31 +- .../Attributes/ParameterPreconditionAttribute.cs | 11 + .../Attributes/PreconditionAttribute.cs | 21 +- .../Preconditions/RequireBotPermissionAttribute.cs | 44 +- .../Preconditions/RequireContextAttribute.cs | 34 +- .../Preconditions/RequireNsfwAttribute.cs | 24 +- .../Preconditions/RequireOwnerAttribute.cs | 33 +- .../RequireUserPermissionAttribute.cs | 47 +- .../Attributes/PriorityAttribute.cs | 12 +- .../Attributes/RemainderAttribute.cs | 3 + .../Attributes/RemarksAttribute.cs | 3 + .../Attributes/SummaryAttribute.cs | 3 + .../Builders/CommandBuilder.cs | 1 + .../Builders/ModuleClassBuilder.cs | 2 +- src/Discord.Net.Commands/CommandContext.cs | 16 +- src/Discord.Net.Commands/CommandError.cs | 27 +- src/Discord.Net.Commands/CommandException.cs | 13 + src/Discord.Net.Commands/CommandMatch.cs | 5 +- src/Discord.Net.Commands/CommandParser.cs | 2 +- src/Discord.Net.Commands/CommandService.cs | 212 +++- src/Discord.Net.Commands/CommandServiceConfig.cs | 49 +- .../Extensions/MessageExtensions.cs | 18 + src/Discord.Net.Commands/Info/CommandInfo.cs | 63 +- src/Discord.Net.Commands/Info/ModuleInfo.cs | 39 + src/Discord.Net.Commands/Info/ParameterInfo.cs | 35 +- src/Discord.Net.Commands/Map/CommandMapNode.cs | 1 + src/Discord.Net.Commands/ModuleBase.cs | 39 +- src/Discord.Net.Commands/MultiMatchHandling.cs | 7 +- .../Readers/ChannelTypeReader.cs | 14 +- src/Discord.Net.Commands/Readers/EnumTypeReader.cs | 7 +- .../Readers/MessageTypeReader.cs | 9 +- .../Readers/NullableTypeReader.cs | 5 +- .../Readers/PrimitiveTypeReader.cs | 8 +- src/Discord.Net.Commands/Readers/RoleTypeReader.cs | 9 +- .../Readers/TimeSpanTypeReader.cs | 1 + src/Discord.Net.Commands/Readers/TypeReader.cs | 14 +- src/Discord.Net.Commands/Readers/UserTypeReader.cs | 16 +- src/Discord.Net.Commands/Results/ExecuteResult.cs | 54 +- src/Discord.Net.Commands/Results/IResult.cs | 24 +- src/Discord.Net.Commands/Results/ParseResult.cs | 8 +- .../Results/PreconditionGroupResult.cs | 2 +- .../Results/PreconditionResult.cs | 27 + src/Discord.Net.Commands/Results/RuntimeResult.cs | 12 +- src/Discord.Net.Commands/Results/SearchResult.cs | 3 + .../Results/TypeReaderResult.cs | 5 + src/Discord.Net.Commands/RunMode.cs | 16 +- .../Utilities/QuotationAliasUtils.cs | 11 +- .../Utilities/ReflectionUtils.cs | 11 +- src/Discord.Net.Core/Audio/AudioOutStream.cs | 17 +- src/Discord.Net.Core/Audio/AudioStream.cs | 34 +- src/Discord.Net.Core/Audio/IAudioClient.cs | 2 +- src/Discord.Net.Core/CDN.cs | 85 ++ src/Discord.Net.Core/Commands/ICommandContext.cs | 20 +- src/Discord.Net.Core/ConnectionState.cs | 7 +- src/Discord.Net.Core/DiscordConfig.cs | 118 ++- .../Entities/Activities/ActivityType.cs | 17 +- src/Discord.Net.Core/Entities/Activities/Game.cs | 11 + .../Entities/Activities/GameAsset.cs | 27 +- .../Entities/Activities/GameParty.cs | 15 + .../Entities/Activities/GameSecrets.cs | 16 +- .../Entities/Activities/GameTimestamps.cs | 13 +- .../Entities/Activities/IActivity.cs | 17 +- .../Entities/Activities/RichGame.cs | 32 +- .../Entities/Activities/SpotifyGame.cs | 63 ++ .../Entities/Activities/StreamingGame.cs | 18 +- .../Entities/AuditLogs/ActionType.cs | 86 +- .../Entities/AuditLogs/IAuditLogData.cs | 8 +- .../Entities/AuditLogs/IAuditLogEntry.cs | 22 +- src/Discord.Net.Core/Entities/CacheMode.cs | 11 +- .../Entities/Channels/ChannelType.cs | 8 +- .../Entities/Channels/Direction.cs | 14 +- .../Entities/Channels/GuildChannelProperties.cs | 27 +- .../Entities/Channels/IAudioChannel.cs | 22 +- .../Entities/Channels/ICategoryChannel.cs | 9 +- src/Discord.Net.Core/Entities/Channels/IChannel.cs | 38 +- .../Entities/Channels/IDMChannel.cs | 22 +- .../Entities/Channels/IGroupChannel.cs | 15 +- .../Entities/Channels/IGuildChannel.cs | 163 +++- .../Entities/Channels/IMessageChannel.cs | 262 ++++- .../Entities/Channels/INestedChannel.cs | 21 +- .../Entities/Channels/IPrivateChannel.cs | 11 +- .../Entities/Channels/ITextChannel.cs | 104 +- .../Entities/Channels/IVoiceChannel.cs | 29 +- .../Entities/Channels/ReorderChannelProperties.cs | 22 +- .../Entities/Channels/TextChannelProperties.cs | 22 +- .../Entities/Channels/VoiceChannelProperties.cs | 10 +- src/Discord.Net.Core/Entities/Emotes/Emoji.cs | 24 +- src/Discord.Net.Core/Entities/Emotes/Emote.cs | 49 +- .../Entities/Emotes/EmoteProperties.cs | 12 +- src/Discord.Net.Core/Entities/Emotes/GuildEmote.cs | 28 +- src/Discord.Net.Core/Entities/Emotes/IEmote.cs | 9 +- .../Entities/Guilds/DefaultMessageNotifications.cs | 13 +- .../Entities/Guilds/GuildEmbedProperties.cs | 10 +- .../Entities/Guilds/GuildIntegrationProperties.cs | 14 +- .../Entities/Guilds/GuildProperties.cs | 47 +- src/Discord.Net.Core/Entities/Guilds/IBan.cs | 17 +- src/Discord.Net.Core/Entities/Guilds/IGuild.cs | 629 ++++++++++-- .../Entities/Guilds/IGuildIntegration.cs | 54 +- src/Discord.Net.Core/Entities/Guilds/IUserGuild.cs | 18 +- .../Entities/Guilds/IVoiceRegion.cs | 45 +- .../Entities/Guilds/IntegrationAccount.cs | 6 +- src/Discord.Net.Core/Entities/Guilds/MfaLevel.cs | 13 +- .../Entities/Guilds/PermissionTarget.cs | 11 +- .../Entities/Guilds/VerificationLevel.cs | 25 +- src/Discord.Net.Core/Entities/IApplication.cs | 20 +- src/Discord.Net.Core/Entities/IDeletable.cs | 10 +- src/Discord.Net.Core/Entities/IEntity.cs | 4 +- src/Discord.Net.Core/Entities/IMentionable.cs | 12 +- src/Discord.Net.Core/Entities/ISnowflakeEntity.cs | 7 + src/Discord.Net.Core/Entities/IUpdateable.cs | 9 +- src/Discord.Net.Core/Entities/Image.cs | 37 +- src/Discord.Net.Core/Entities/ImageFormat.cs | 20 +- src/Discord.Net.Core/Entities/Invites/IInvite.cs | 75 +- .../Entities/Invites/IInviteMetadata.cs | 55 +- src/Discord.Net.Core/Entities/Messages/Embed.cs | 22 + .../Entities/Messages/EmbedAuthor.cs | 22 +- .../Entities/Messages/EmbedBuilder.cs | 396 +++++++- .../Entities/Messages/EmbedField.cs | 20 +- .../Entities/Messages/EmbedFooter.cs | 32 +- .../Entities/Messages/EmbedImage.cs | 34 +- .../Entities/Messages/EmbedProvider.cs | 20 +- .../Entities/Messages/EmbedThumbnail.cs | 34 +- .../Entities/Messages/EmbedType.cs | 30 + .../Entities/Messages/EmbedVideo.cs | 30 +- .../Entities/Messages/IAttachment.cs | 47 +- src/Discord.Net.Core/Entities/Messages/IEmbed.cs | 84 +- src/Discord.Net.Core/Entities/Messages/IMessage.cs | 95 +- .../Entities/Messages/IReaction.cs | 8 +- .../Entities/Messages/ISystemMessage.cs | 5 +- .../Entities/Messages/IUserMessage.cs | 104 +- .../Entities/Messages/MessageProperties.cs | 27 +- .../Entities/Messages/MessageSource.cs | 15 + .../Entities/Messages/MessageType.cs | 26 +- .../Entities/Messages/ReactionMetadata.cs | 19 +- .../Entities/Messages/TagHandling.cs | 42 +- src/Discord.Net.Core/Entities/Messages/TagType.cs | 9 +- .../Entities/Permissions/ChannelPermission.cs | 99 +- .../Entities/Permissions/ChannelPermissions.cs | 70 +- .../Entities/Permissions/GuildPermission.cs | 135 ++- .../Entities/Permissions/GuildPermissions.cs | 77 +- .../Entities/Permissions/Overwrite.cs | 21 +- .../Entities/Permissions/OverwritePermissions.cs | 45 +- .../Entities/Permissions/PermValue.cs | 6 +- src/Discord.Net.Core/Entities/Roles/Color.cs | 137 ++- src/Discord.Net.Core/Entities/Roles/IRole.cs | 80 +- .../Entities/Roles/ReorderRoleProperties.cs | 24 +- .../Entities/Roles/RoleProperties.cs | 37 +- .../Entities/Users/GuildUserProperties.cs | 59 +- src/Discord.Net.Core/Entities/Users/IConnection.cs | 15 +- src/Discord.Net.Core/Entities/Users/IGroupUser.cs | 5 +- src/Discord.Net.Core/Entities/Users/IGuildUser.cs | 115 ++- src/Discord.Net.Core/Entities/Users/IPresence.cs | 15 +- src/Discord.Net.Core/Entities/Users/ISelfUser.cs | 26 +- src/Discord.Net.Core/Entities/Users/IUser.cs | 54 +- src/Discord.Net.Core/Entities/Users/IVoiceState.cs | 33 +- .../Entities/Users/IWebhookUser.cs | 4 +- .../Entities/Users/SelfUserProperties.cs | 18 +- src/Discord.Net.Core/Entities/Users/UserStatus.cs | 23 +- src/Discord.Net.Core/Entities/Webhooks/IWebhook.cs | 43 +- .../Entities/Webhooks/WebhookProperties.cs | 27 +- .../Extensions/AsyncEnumerableExtensions.cs | 10 +- .../Extensions/DiscordClientExtensions.cs | 9 +- .../Extensions/EmbedBuilderExtensions.cs | 11 + .../Extensions/MessageExtensions.cs | 10 + src/Discord.Net.Core/Extensions/UserExtensions.cs | 119 ++- src/Discord.Net.Core/Format.cs | 1 + src/Discord.Net.Core/IDiscordClient.cs | 238 ++++- src/Discord.Net.Core/Logging/LogManager.cs | 10 +- src/Discord.Net.Core/Logging/LogMessage.cs | 41 +- src/Discord.Net.Core/Logging/LogSeverity.cs | 24 +- src/Discord.Net.Core/LoginState.cs | 7 +- src/Discord.Net.Core/Net/HttpException.cs | 32 + src/Discord.Net.Core/Net/IRequest.cs | 3 + src/Discord.Net.Core/Net/RateLimitedException.cs | 10 + src/Discord.Net.Core/Net/Rest/IRestClient.cs | 21 + .../Net/WebSocketClosedException.cs | 20 +- src/Discord.Net.Core/RequestOptions.cs | 40 +- src/Discord.Net.Core/RetryMode.cs | 4 +- src/Discord.Net.Core/TokenType.cs | 10 + src/Discord.Net.Core/Utils/Cacheable.cs | 37 +- src/Discord.Net.Core/Utils/Comparers.cs | 18 + src/Discord.Net.Core/Utils/ConcurrentHashSet.cs | 8 +- src/Discord.Net.Core/Utils/DateTimeUtils.cs | 3 +- src/Discord.Net.Core/Utils/MentionUtils.cs | 56 +- src/Discord.Net.Core/Utils/Optional.cs | 3 +- src/Discord.Net.Core/Utils/Permissions.cs | 2 +- src/Discord.Net.Core/Utils/Preconditions.cs | 2 + src/Discord.Net.Core/Utils/SnowflakeUtils.cs | 17 + src/Discord.Net.Core/Utils/TokenUtils.cs | 11 +- src/Discord.Net.Providers.WS4Net/WS4NetClient.cs | 4 +- src/Discord.Net.Rest/API/Common/EmbedAuthor.cs | 1 - src/Discord.Net.Rest/API/Common/EmbedFooter.cs | 1 - src/Discord.Net.Rest/API/Common/EmbedImage.cs | 3 +- src/Discord.Net.Rest/API/Common/EmbedProvider.cs | 3 +- src/Discord.Net.Rest/API/Common/EmbedThumbnail.cs | 3 +- src/Discord.Net.Rest/API/Common/EmbedVideo.cs | 3 +- src/Discord.Net.Rest/API/Rest/UploadFileParams.cs | 1 - src/Discord.Net.Rest/BaseDiscordClient.cs | 35 +- src/Discord.Net.Rest/ClientHelper.cs | 4 +- src/Discord.Net.Rest/DiscordRestApiClient.cs | 47 +- src/Discord.Net.Rest/DiscordRestClient.cs | 54 +- src/Discord.Net.Rest/DiscordRestConfig.cs | 5 +- .../AuditLogs/DataTypes/BanAuditLogData.cs | 11 +- .../DataTypes/ChannelCreateAuditLogData.cs | 29 +- .../DataTypes/ChannelDeleteAuditLogData.cs | 30 +- .../Entities/AuditLogs/DataTypes/ChannelInfo.cs | 29 + .../DataTypes/ChannelUpdateAuditLogData.cs | 23 +- .../AuditLogs/DataTypes/EmoteCreateAuditLogData.cs | 19 +- .../AuditLogs/DataTypes/EmoteDeleteAuditLogData.cs | 17 +- .../AuditLogs/DataTypes/EmoteUpdateAuditLogData.cs | 23 +- .../Entities/AuditLogs/DataTypes/GuildInfo.cs | 55 ++ .../AuditLogs/DataTypes/GuildUpdateAuditLogData.cs | 17 +- .../DataTypes/InviteCreateAuditLogData.cs | 49 +- .../DataTypes/InviteDeleteAuditLogData.cs | 49 +- .../Entities/AuditLogs/DataTypes/InviteInfo.cs | 37 + .../DataTypes/InviteUpdateAuditLogData.cs | 15 + .../AuditLogs/DataTypes/KickAuditLogData.cs | 9 + .../AuditLogs/DataTypes/MemberRoleAuditLogData.cs | 17 +- .../AuditLogs/DataTypes/MemberRoleEditInfo.cs | 21 + .../DataTypes/MemberUpdateAuditLogData.cs | 12 +- .../DataTypes/MessageDeleteAuditLogData.cs | 16 + .../DataTypes/OverwriteCreateAuditLogData.cs | 9 + .../DataTypes/OverwriteDeleteAuditLogData.cs | 15 +- .../DataTypes/OverwriteUpdateAuditLogData.cs | 30 +- .../AuditLogs/DataTypes/PruneAuditLogData.cs | 18 + .../AuditLogs/DataTypes/RoleCreateAuditLogData.cs | 15 + .../AuditLogs/DataTypes/RoleDeleteAuditLogData.cs | 15 + .../Entities/AuditLogs/DataTypes/RoleEditInfo.cs | 38 + .../AuditLogs/DataTypes/RoleUpdateAuditLogData.cs | 21 + .../AuditLogs/DataTypes/UnbanAuditLogData.cs | 9 + .../DataTypes/WebhookCreateAuditLogData.cs | 35 +- .../DataTypes/WebhookDeleteAuditLogData.cs | 38 +- .../Entities/AuditLogs/DataTypes/WebhookInfo.cs | 22 + .../DataTypes/WebhookUpdateAuditLogData.cs | 28 +- .../Entities/AuditLogs/RestAuditLogEntry.cs | 3 + .../Entities/Channels/ChannelHelper.cs | 41 +- .../Entities/Channels/IRestMessageChannel.cs | 186 +++- .../Entities/Channels/IRestPrivateChannel.cs | 8 +- .../Entities/Channels/RestCategoryChannel.cs | 13 +- .../Entities/Channels/RestChannel.cs | 10 + .../Entities/Channels/RestDMChannel.cs | 94 +- .../Entities/Channels/RestGroupChannel.cs | 50 +- .../Entities/Channels/RestGuildChannel.cs | 113 ++- .../Entities/Channels/RestTextChannel.cs | 133 ++- .../Entities/Channels/RestVoiceChannel.cs | 20 + .../Entities/Channels/RpcVirtualMessageChannel.cs | 27 +- .../Entities/Guilds/GuildHelper.cs | 24 +- src/Discord.Net.Rest/Entities/Guilds/RestBan.cs | 19 +- src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs | 387 +++++++- .../Entities/Guilds/RestGuildEmbed.cs | 4 +- .../Entities/Guilds/RestGuildIntegration.cs | 14 +- .../Entities/Guilds/RestUserGuild.cs | 8 +- .../Entities/Guilds/RestVoiceRegion.cs | 3 + .../Entities/Invites/RestInvite.cs | 22 +- .../Entities/Invites/RestInviteMetadata.cs | 11 + .../Entities/Messages/Attachment.cs | 18 +- .../Entities/Messages/MessageHelper.cs | 6 +- .../Entities/Messages/RestMessage.cs | 40 +- .../Entities/Messages/RestReaction.cs | 12 +- .../Entities/Messages/RestSystemMessage.cs | 6 +- .../Entities/Messages/RestUserMessage.cs | 26 +- src/Discord.Net.Rest/Entities/RestApplication.cs | 21 +- src/Discord.Net.Rest/Entities/Roles/RestRole.cs | 27 +- .../Entities/Users/RestConnection.cs | 13 +- .../Entities/Users/RestGroupUser.cs | 14 +- .../Entities/Users/RestGuildUser.cs | 23 + .../Entities/Users/RestSelfUser.cs | 13 +- src/Discord.Net.Rest/Entities/Users/RestUser.cs | 32 +- .../Entities/Users/RestWebhookUser.cs | 54 +- src/Discord.Net.Rest/Entities/Users/UserHelper.cs | 4 +- .../Entities/Webhooks/RestWebhook.cs | 15 +- .../Net/Converters/ImageConverter.cs | 3 +- .../Net/Converters/PermissionTargetConverter.cs | 8 +- src/Discord.Net.Rest/Net/DefaultRestClient.cs | 4 +- .../Net/DefaultRestClientProvider.cs | 1 + src/Discord.Net.Rest/Net/Queue/RequestQueue.cs | 2 +- .../Net/Queue/RequestQueueBucket.cs | 2 +- src/Discord.Net.Rest/Utils/TypingNotifier.cs | 16 +- src/Discord.Net.WebSocket/Audio/AudioClient.cs | 1 - .../Audio/Streams/OpusDecodeStream.cs | 9 +- .../Audio/Streams/OpusEncodeStream.cs | 2 +- .../Audio/Streams/RTPReadStream.cs | 5 +- .../Audio/Streams/SodiumDecryptStream.cs | 4 +- .../Audio/Streams/SodiumEncryptStream.cs | 14 +- .../BaseSocketClient.Events.cs | 88 ++ src/Discord.Net.WebSocket/BaseSocketClient.cs | 228 ++++- src/Discord.Net.WebSocket/ClientState.cs | 2 +- .../Commands/ShardedCommandContext.cs | 6 +- .../Commands/SocketCommandContext.cs | 33 +- src/Discord.Net.WebSocket/DiscordShardedClient.cs | 40 +- .../DiscordSocketApiClient.cs | 10 +- .../DiscordSocketClient.Events.cs | 9 +- src/Discord.Net.WebSocket/DiscordSocketClient.cs | 114 ++- src/Discord.Net.WebSocket/DiscordSocketConfig.cs | 55 +- .../Entities/Channels/ISocketAudioChannel.cs | 5 +- .../Entities/Channels/ISocketMessageChannel.cs | 111 ++- .../Entities/Channels/ISocketPrivateChannel.cs | 5 +- .../Entities/Channels/SocketCategoryChannel.cs | 24 +- .../Entities/Channels/SocketChannel.cs | 23 +- .../Entities/Channels/SocketChannelHelper.cs | 9 +- .../Entities/Channels/SocketDMChannel.cs | 174 +++- .../Entities/Channels/SocketGroupChannel.cs | 52 +- .../Entities/Channels/SocketGuildChannel.cs | 126 ++- .../Entities/Channels/SocketTextChannel.cs | 196 +++- .../Entities/Channels/SocketVoiceChannel.cs | 21 + .../Entities/Guilds/SocketGuild.cs | 368 ++++++- .../Entities/Messages/MessageCache.cs | 4 +- .../Entities/Messages/SocketMessage.cs | 72 +- .../Entities/Messages/SocketReaction.cs | 40 +- .../Entities/Messages/SocketSystemMessage.cs | 6 +- .../Entities/Messages/SocketUserMessage.cs | 27 +- .../Entities/Roles/SocketRole.cs | 36 +- src/Discord.Net.WebSocket/Entities/SocketEntity.cs | 3 +- .../Entities/Users/SocketGlobalUser.cs | 5 +- .../Entities/Users/SocketGroupUser.cs | 23 +- .../Entities/Users/SocketGuildUser.cs | 57 +- .../Entities/Users/SocketPresence.cs | 14 +- .../Entities/Users/SocketSelfUser.cs | 18 +- .../Entities/Users/SocketUnknownUser.cs | 21 +- .../Entities/Users/SocketUser.cs | 26 +- .../Entities/Users/SocketVoiceState.cs | 27 +- .../Entities/Users/SocketWebhookUser.cs | 70 +- .../Entities/Voice/SocketVoiceServer.cs | 27 +- .../Net/DefaultWebSocketClientProvider.cs | 1 + src/Discord.Net.Webhook/DiscordWebhookClient.cs | 20 +- .../Entities/Webhooks/RestInternalWebhook.cs | 2 +- src/Discord.Net.Webhook/WebhookClientHelper.cs | 5 +- .../AnalyzerTests/GuildAccessTests.cs | 6 +- .../Helpers/DiagnosticVerifier.Helper.cs | 3 +- .../AnalyzerTests/Verifiers/DiagnosticVerifier.cs | 5 +- test/Discord.Net.Tests/Net/HttpMixin.cs | 3 +- test/Discord.Net.Tests/Tests.Channels.cs | 13 +- test/Discord.Net.Tests/Tests.GuildPermissions.cs | 4 +- test/Discord.Net.Tests/Tests.Migrations.cs | 2 +- test/Discord.Net.Tests/Tests.Permissions.cs | 1 - 498 files changed, 16061 insertions(+), 2630 deletions(-) create mode 100644 Discord.Net.code-workspace create mode 100644 Discord.Net.sln.DotSettings create mode 100644 docs/Discord.Net.Docs.code-workspace create mode 100644 docs/_overwrites/Commands/CommandException.Overwrite.md create mode 100644 docs/_overwrites/Commands/DontAutoLoadAttribute.Overwrite.md create mode 100644 docs/_overwrites/Commands/DontInjectAttribute.Overwrite.md create mode 100644 docs/_overwrites/Commands/ICommandContext.Inclusion.md create mode 100644 docs/_overwrites/Commands/ICommandContext.Overwrite.md create mode 100644 docs/_overwrites/Commands/PreconditionAttribute.Overwrites.md create mode 100644 docs/_overwrites/Commands/PreconditionAttribute.Remarks.Inclusion.md create mode 100644 docs/_overwrites/Common/EmbedBuilder.Overwrites.md create mode 100644 docs/_overwrites/Common/EmbedObjectBuilder.Inclusion.md create mode 100644 docs/_overwrites/Common/EmbedObjectBuilder.Overwrites.md create mode 100644 docs/_overwrites/Common/IEmote.Inclusion.md create mode 100644 docs/_overwrites/Common/IEmote.Overwrites.md create mode 100644 docs/_overwrites/Common/ObjectProperties.Overwrites.md create mode 100644 docs/_overwrites/Common/OverrideTypeReaderAttribute.Overwrites.md create mode 100644 docs/_overwrites/Common/images/embed-example.png create mode 100644 docs/_overwrites/Common/images/react-example.png create mode 100644 docs/_template/description-generator/plugins/DocFX.Plugin.DescriptionGenerator.dll create mode 100644 docs/_template/description-generator/plugins/LICENSE create mode 100644 docs/_template/last-modified/plugins/LICENSE create mode 100644 docs/_template/last-modified/plugins/LastModifiedPostProcessor.dll create mode 100644 docs/_template/light-dark-theme/partials/affix.tmpl.partial create mode 100644 docs/_template/light-dark-theme/partials/head.tmpl.partial create mode 100644 docs/_template/light-dark-theme/partials/scripts.tmpl.partial create mode 100644 docs/_template/light-dark-theme/styles/cornerify.js create mode 100644 docs/_template/light-dark-theme/styles/dark.css create mode 100644 docs/_template/light-dark-theme/styles/docfx.vendor.minify.css create mode 100644 docs/_template/light-dark-theme/styles/gray.css create mode 100644 docs/_template/light-dark-theme/styles/light.css create mode 100644 docs/_template/light-dark-theme/styles/master.css create mode 100644 docs/_template/light-dark-theme/styles/plugin-featherlight.js create mode 100644 docs/_template/light-dark-theme/styles/styleswitcher.js create mode 100644 docs/_template/light-dark-theme/styles/theme-switcher.css create mode 100644 docs/_template/light-dark-theme/styles/tomorrow.css create mode 100644 docs/_template/light-dark-theme/styles/vs2015.css create mode 100644 docs/faq/basics/basic-operations.md create mode 100644 docs/faq/basics/client-basics.md create mode 100644 docs/faq/basics/getting-started.md create mode 100644 docs/faq/basics/images/dev-mode.png create mode 100644 docs/faq/basics/images/mention-escape.png create mode 100644 docs/faq/basics/images/snowflake.png create mode 100644 docs/faq/basics/samples/cast.cs create mode 100644 docs/faq/basics/samples/emoji-others.cs create mode 100644 docs/faq/basics/samples/emoji-self.cs create mode 100644 docs/faq/commands/dependency-injection.md create mode 100644 docs/faq/commands/general.md create mode 100644 docs/faq/commands/samples/DI.cs create mode 100644 docs/faq/commands/samples/Remainder.cs create mode 100644 docs/faq/commands/samples/missing-dep.cs create mode 100644 docs/faq/commands/samples/runmode-cmdattrib.cs create mode 100644 docs/faq/commands/samples/runmode-cmdconfig.cs create mode 100644 docs/faq/misc/glossary.md create mode 100644 docs/faq/misc/legacy.md create mode 100644 docs/faq/toc.yml delete mode 100644 docs/guides/commands/commands.md create mode 100644 docs/guides/commands/dependency-injection.md create mode 100644 docs/guides/commands/intro.md create mode 100644 docs/guides/commands/post-execution.md create mode 100644 docs/guides/commands/preconditions.md delete mode 100644 docs/guides/commands/samples/command_handler.cs create mode 100644 docs/guides/commands/samples/dependency-injection/dependency_map_setup.cs create mode 100644 docs/guides/commands/samples/dependency-injection/dependency_module.cs create mode 100644 docs/guides/commands/samples/dependency-injection/dependency_module_noinject.cs delete mode 100644 docs/guides/commands/samples/dependency_map_setup.cs delete mode 100644 docs/guides/commands/samples/dependency_module.cs delete mode 100644 docs/guides/commands/samples/empty-module.cs create mode 100644 docs/guides/commands/samples/intro/command_handler.cs create mode 100644 docs/guides/commands/samples/intro/empty-module.cs rename docs/guides/commands/samples/{ => intro}/groups.cs (52%) rename docs/guides/commands/samples/{ => intro}/module.cs (58%) create mode 100644 docs/guides/commands/samples/post-execution/command_exception_log.cs create mode 100644 docs/guides/commands/samples/post-execution/command_executed_adv_demo.cs create mode 100644 docs/guides/commands/samples/post-execution/command_executed_demo.cs create mode 100644 docs/guides/commands/samples/post-execution/customresult_base.cs create mode 100644 docs/guides/commands/samples/post-execution/customresult_extended.cs create mode 100644 docs/guides/commands/samples/post-execution/customresult_usage.cs create mode 100644 docs/guides/commands/samples/post-execution/post-execution_basic.cs create mode 100644 docs/guides/commands/samples/preconditions/group_precondition.cs create mode 100644 docs/guides/commands/samples/preconditions/precondition_usage.cs rename docs/guides/commands/samples/{ => preconditions}/require_owner.cs (66%) create mode 100644 docs/guides/commands/samples/typereaders/typereader-register.cs rename docs/guides/commands/samples/{ => typereaders}/typereader.cs (74%) create mode 100644 docs/guides/commands/typereaders.md create mode 100644 docs/guides/deployment/deployment.md create mode 100644 docs/guides/emoji/emoji.md create mode 100644 docs/guides/emoji/images/emojipedia.png create mode 100644 docs/guides/emoji/images/emote-format.png create mode 100644 docs/guides/emoji/images/fileformat-emoji-src.png create mode 100644 docs/guides/emoji/samples/emoji-sample.cs create mode 100644 docs/guides/emoji/samples/emote-sample.cs create mode 100644 docs/guides/emoji/samples/socket-emote-sample.cs create mode 100644 docs/guides/getting_started/first-bot.md create mode 100644 docs/guides/getting_started/images/appveyor-artifacts.png create mode 100644 docs/guides/getting_started/images/appveyor-nupkg.png create mode 100644 docs/guides/getting_started/images/intro-authorize.png create mode 100644 docs/guides/getting_started/images/intro-bot-settings.png delete mode 100644 docs/guides/getting_started/images/intro-client-id.png delete mode 100644 docs/guides/getting_started/images/intro-create-app.png delete mode 100644 docs/guides/getting_started/images/intro-create-bot.png create mode 100644 docs/guides/getting_started/images/intro-oauth-settings.png create mode 100644 docs/guides/getting_started/images/intro-public-bot.png create mode 100644 docs/guides/getting_started/images/intro-scopes-bot.png create mode 100644 docs/guides/getting_started/images/nightlies-vs-note.png create mode 100644 docs/guides/getting_started/images/nightlies-vs-step1.png create mode 100644 docs/guides/getting_started/images/nightlies-vs-step2.png create mode 100644 docs/guides/getting_started/images/nightlies-vs-step4.png delete mode 100644 docs/guides/getting_started/intro.md create mode 100644 docs/guides/getting_started/nightlies.md create mode 100644 docs/guides/getting_started/samples/first-bot/async-context.cs create mode 100644 docs/guides/getting_started/samples/first-bot/client.cs create mode 100644 docs/guides/getting_started/samples/first-bot/complete.cs create mode 100644 docs/guides/getting_started/samples/first-bot/logging.cs rename docs/guides/getting_started/samples/{intro => first-bot}/message.cs (92%) rename docs/guides/getting_started/samples/{intro => first-bot}/structure.cs (100%) delete mode 100644 docs/guides/getting_started/samples/intro/async-context.cs delete mode 100644 docs/guides/getting_started/samples/intro/client.cs delete mode 100644 docs/guides/getting_started/samples/intro/complete.cs delete mode 100644 docs/guides/getting_started/samples/intro/logging.cs delete mode 100644 docs/guides/getting_started/samples/project.csproj create mode 100644 docs/guides/getting_started/samples/project.xml create mode 100644 docs/guides/introduction/intro.md delete mode 100644 docs/guides/migrating/migrating.md delete mode 100644 docs/guides/migrating/samples/event.cs delete mode 100644 docs/guides/migrating/samples/sync_event.cs create mode 100644 docs/langwordMapping.yml diff --git a/.gitignore b/.gitignore index 45e5e009d..954362408 100644 --- a/.gitignore +++ b/.gitignore @@ -206,3 +206,6 @@ project.lock.json docs/api/\.manifest \.idea/ + +# Codealike UID +codealike.json \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8248291e8..752b40931 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -41,4 +41,22 @@ We attempt to conform to the .NET Foundation's [Coding Style](https://github.com where possible. As a general rule, follow the coding style already set in the file you -are editing, or look at a similar file if you are adding a new one. \ No newline at end of file +are editing, or look at a similar file if you are adding a new one. + +### Documentation Style for Members + +When creating a new public member, the member must be annotated with sufficient documentation. This should include the +following, but not limited to: + +* `` summarizing the purpose of the method. +* `` or `` explaining the parameter. +* `` explaining the type of the returned member and what it is. +* `` if the method directly throws an exception. + +The length of the documentation should also follow the ruler as suggested by our +[Visual Studio Code workspace](Discord.Net.code-workspace). + +#### Recommended Reads + +* [Official Microsoft Documentation](https://docs.microsoft.com) +* [Sandcastle User Manual](https://ewsoftware.github.io/XMLCommentsGuide/html/4268757F-CE8D-4E6D-8502-4F7F2E22DDA3.htm) \ No newline at end of file diff --git a/Discord.Net.code-workspace b/Discord.Net.code-workspace new file mode 100644 index 000000000..709eb0e95 --- /dev/null +++ b/Discord.Net.code-workspace @@ -0,0 +1,23 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": { + "editor.rulers": [ + 120 + ], + "files.exclude": { + "**/.git": true, + "**/.svn": true, + "**/.hg": true, + "**/CVS": true, + "**/.DS_Store": true, + "docs/": true, + "**/obj": true, + "**/bin": true, + "samples/": true, + } + } +} \ No newline at end of file diff --git a/Discord.Net.sln.DotSettings b/Discord.Net.sln.DotSettings new file mode 100644 index 000000000..ca75a7f1b --- /dev/null +++ b/Discord.Net.sln.DotSettings @@ -0,0 +1,16 @@ + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 296b6d1cb..8641d377e 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -1,27 +1,21 @@ # Contributing to Docs -I don't really have any strict conditions for writing documentation, -but just keep these few guidelines in mind: +## General Guidelines + +We do not have any strict conditions for writing documentation, +but keep these guidelines in mind: * Keep code samples in the `guides/samples` folder -* When referencing an object in the API, link to it's page in the -API documentation. +* When referencing an object in the API, link to its page in the + API documentation +* Documentation should be written in an FAQ/Wiki-style format * Documentation should be written in clear and proper English* -\* If anyone is interested in translating documentation into other -languages, please open an issue or contact me on +\* If anyone is interested in translating documentation into other +languages, please open an issue or contact me on Discord (`foxbot#0282`). -### Layout - -Documentation should be written in a FAQ/Wiki style format. - -Recommended reads: - -* http://docs.microsoft.com -* http://flask.pocoo.org/docs/0.12/ - -Style consistencies: +## Style Consistencies * Use a ruler set at 70 characters * Links should use long syntax @@ -29,18 +23,13 @@ Style consistencies: Example of long link syntax: -``` +```md Please consult the [API Documentation] for more information. [API Documentation]: xref:System.String ``` -### Compiling - -Documentation is compiled into a static site using [DocFx]. -We currently use the most recent build off the dev branch. +## Recommended Reads -After making changes, compile your changes into the static site with -`docfx`. You can also view your changes live with `docfx --serve`. - -[DocFx]: https://dotnet.github.io/docfx/ \ No newline at end of file +* http://docs.microsoft.com +* http://flask.pocoo.org/docs/0.12/ \ No newline at end of file diff --git a/docs/Discord.Net.Docs.code-workspace b/docs/Discord.Net.Docs.code-workspace new file mode 100644 index 000000000..d9f442869 --- /dev/null +++ b/docs/Discord.Net.Docs.code-workspace @@ -0,0 +1,21 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": { + "editor.rulers": [ + 70 + ], + "files.exclude": { + "**/.git": true, + "**/.svn": true, + "**/.hg": true, + "**/CVS": true, + "**/.DS_Store": true, + "obj/": true, + "_site/": true, + } + } +} \ No newline at end of file diff --git a/docs/README.md b/docs/README.md index a672330d4..4a06dccab 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,16 +1,15 @@ # Instructions for Building Documentation -The documentation for the Discord.NET library uses [DocFX][docfx-main]. [Instructions for installing this tool can be found here.][docfx-installing] +The documentation for the Discord.Net library uses [DocFX][docfx-main]. +Instructions for installing this tool can be found [here][docfx-installing]. 1. Navigate to the root of the repository. -2. (Optional) If you intend to target a specific version, ensure that you -have the correct version checked out. -3. Build the library. Run `dotnet build` in the root of this repository. - Ensure that the build passes without errors. -4. Build the docs using `docfx .\docs\docfx.json`. Add the `--serve` parameter -to preview the site locally. Some elements of the page may appear incorrect -when not hosted by a server. - - Remarks: According to the docfx website, this tool does work on Linux under mono. +2. Build the docs using `docfx docs/docfx.json`. Add the `--serve` + parameter to preview the site locally. Some elements of the page + may appear incorrectly when hosted offline. + +Please note that if you intend to target a specific version, ensure +that you have the correct version checked out. [docfx-main]: https://dotnet.github.io/docfx/ -[docfx-installing]: https://dotnet.github.io/docfx/tutorial/docfx_getting_started.html +[docfx-installing]: https://dotnet.github.io/docfx/tutorial/docfx_getting_started.html \ No newline at end of file diff --git a/docs/_overwrites/Commands/CommandException.Overwrite.md b/docs/_overwrites/Commands/CommandException.Overwrite.md new file mode 100644 index 000000000..166a011de --- /dev/null +++ b/docs/_overwrites/Commands/CommandException.Overwrite.md @@ -0,0 +1,31 @@ +--- +uid: Discord.Commands.CommandException +remarks: *content +--- + +This @System.Exception class is typically used when diagnosing +an error thrown during the execution of a command. You will find the +thrown exception passed into +[LogMessage.Exception](xref:Discord.LogMessage.Exception), which is +sent to your [CommandService.Log](xref:Discord.Commands.CommandService.Log) +event handler. + +--- +uid: Discord.Commands.CommandException +example: [*content] +--- + +You may use this information to handle runtime exceptions after +execution. Below is an example of how you may use this: + +```cs +public Task LogHandlerAsync(LogMessage logMessage) +{ + // Note that this casting method requires C#7 and up. + if (logMessage?.Exception is CommandException cmdEx) + { + Console.WriteLine($"{cmdEx.GetBaseException().GetType()} was thrown while executing {cmdEx.Command.Aliases.First()} in {cmdEx.Context.Channel} by {cmdEx.Context.User}."); + } + return Task.CompletedTask; +} +``` \ No newline at end of file diff --git a/docs/_overwrites/Commands/DontAutoLoadAttribute.Overwrite.md b/docs/_overwrites/Commands/DontAutoLoadAttribute.Overwrite.md new file mode 100644 index 000000000..d47980df7 --- /dev/null +++ b/docs/_overwrites/Commands/DontAutoLoadAttribute.Overwrite.md @@ -0,0 +1,22 @@ +--- +uid: Discord.Commands.DontAutoLoadAttribute +remarks: *content +--- + +The attribute can be applied to a public class that inherits +@Discord.Commands.ModuleBase. By applying this attribute, +@Discord.Commands.CommandService.AddModulesAsync* will not discover and +add the marked module to the CommandService. + +--- +uid: Discord.Commands.DontAutoLoadAttribute +example: [*content] +--- + +```cs +[DontAutoLoad] +public class MyModule : ModuleBase +{ + // ... +} +``` \ No newline at end of file diff --git a/docs/_overwrites/Commands/DontInjectAttribute.Overwrite.md b/docs/_overwrites/Commands/DontInjectAttribute.Overwrite.md new file mode 100644 index 000000000..950d2990c --- /dev/null +++ b/docs/_overwrites/Commands/DontInjectAttribute.Overwrite.md @@ -0,0 +1,27 @@ +--- +uid: Discord.Commands.DontInjectAttribute +remarks: *content +--- + +The attribute can be applied to a public settable property inside a +@Discord.Commands.ModuleBase based class. By applying this attribute, +the marked property will not be automatically injected of the +dependency. See @Guides.Commands.DI to learn more. + +--- +uid: Discord.Commands.DontInjectAttribute +example: [*content] +--- + +```cs +public class MyModule : ModuleBase +{ + [DontInject] + public MyService MyService { get; set; } + + public MyModule() + { + MyService = new MyService(); + } +} +``` \ No newline at end of file diff --git a/docs/_overwrites/Commands/ICommandContext.Inclusion.md b/docs/_overwrites/Commands/ICommandContext.Inclusion.md new file mode 100644 index 000000000..4c1257b23 --- /dev/null +++ b/docs/_overwrites/Commands/ICommandContext.Inclusion.md @@ -0,0 +1,5 @@ +An example of how this class is used the command system can be seen +below: + +[!code[Sample module](../../guides/commands/samples/intro/empty-module.cs)] +[!code[Command handler](../../guides/commands/samples/intro/command_handler.cs)] \ No newline at end of file diff --git a/docs/_overwrites/Commands/ICommandContext.Overwrite.md b/docs/_overwrites/Commands/ICommandContext.Overwrite.md new file mode 100644 index 000000000..d9e50b46d --- /dev/null +++ b/docs/_overwrites/Commands/ICommandContext.Overwrite.md @@ -0,0 +1,27 @@ +--- +uid: Discord.Commands.ICommandContext +example: [*content] +--- + +[!include[Example Section](ICommandContext.Inclusion.md)] + +--- +uid: Discord.Commands.CommandContext +example: [*content] +--- + +[!include[Example Section](ICommandContext.Inclusion.md)] + +--- +uid: Discord.Commands.SocketCommandContext +example: [*content] +--- + +[!include[Example Section](ICommandContext.Inclusion.md)] + +--- +uid: Discord.Commands.ShardCommandContext +example: [*content] +--- + +[!include[Example Section](ICommandContext.Inclusion.md)] \ No newline at end of file diff --git a/docs/_overwrites/Commands/PreconditionAttribute.Overwrites.md b/docs/_overwrites/Commands/PreconditionAttribute.Overwrites.md new file mode 100644 index 000000000..75b9f93a5 --- /dev/null +++ b/docs/_overwrites/Commands/PreconditionAttribute.Overwrites.md @@ -0,0 +1,103 @@ +--- +uid: Discord.Commands.PreconditionAttribute +remarks: *content +--- + +This precondition attribute can be applied on module-level or +method-level for a command. + +[!include[Additional Remarks](PreconditionAttribute.Remarks.Inclusion.md)] + +--- +uid: Discord.Commands.ParameterPreconditionAttribute +remarks: *content +--- + +This precondition attribute can be applied on parameter-level for a +command. + +[!include[Additional Remarks](PreconditionAttribute.Remarks.Inclusion.md)] + +--- +uid: Discord.Commands.PreconditionAttribute +example: [*content] +--- + +The following example creates a precondition to see if the user has +sufficient role required to access the command. + +```cs +public class RequireRoleAttribute : PreconditionAttribute +{ + private readonly ulong _roleId; + + public RequireRoleAttribute(ulong roleId) + { + _roleId = roleId; + } + + public override async Task CheckPermissionsAsync(ICommandContext context, + CommandInfo command, IServiceProvider services) + { + var guildUser = context.User as IGuildUser; + if (guildUser == null) + return PreconditionResult.FromError("This command cannot be executed outside of a guild."); + + var guild = guildUser.Guild; + if (guild.Roles.All(r => r.Id != _roleId)) + return PreconditionResult.FromError( + $"The guild does not have the role ({_roleId}) required to access this command."); + + return guildUser.RoleIds.Any(rId => rId == _roleId) + ? PreconditionResult.FromSuccess() + : PreconditionResult.FromError("You do not have the sufficient role required to access this command."); + } +} +``` + +--- +uid: Discord.Commands.ParameterPreconditionAttribute +example: [*content] +--- + +The following example creates a precondition on a parameter-level to +see if the targeted user has a lower hierarchy than the user who +executed the command. + +```cs +public class RequireHierarchyAttribute : ParameterPreconditionAttribute +{ + public override async Task CheckPermissionsAsync(ICommandContext context, + ParameterInfo parameter, object value, IServiceProvider services) + { + // Hierarchy is only available under the socket variant of the user. + if (!(context.User is SocketGuildUser guildUser)) + return PreconditionResult.FromError("This command cannot be used outside of a guild."); + + SocketGuildUser targetUser; + switch (value) + { + case SocketGuildUser targetGuildUser: + targetUser = targetGuildUser; + break; + case ulong userId: + targetUser = await context.Guild.GetUserAsync(userId).ConfigureAwait(false) as SocketGuildUser; + break; + default: + throw new ArgumentOutOfRangeException(); + } + + if (targetUser == null) + return PreconditionResult.FromError("Target user not found."); + + if (guildUser.Hierarchy < targetUser.Hierarchy) + return PreconditionResult.FromError("You cannot target anyone else whose roles are higher than yours."); + + var currentUser = await context.Guild.GetCurrentUserAsync().ConfigureAwait(false) as SocketGuildUser; + if (currentUser?.Hierarchy < targetUser.Hierarchy) + return PreconditionResult.FromError("The bot's role is lower than the targeted user."); + + return PreconditionResult.FromSuccess(); + } +} +``` \ No newline at end of file diff --git a/docs/_overwrites/Commands/PreconditionAttribute.Remarks.Inclusion.md b/docs/_overwrites/Commands/PreconditionAttribute.Remarks.Inclusion.md new file mode 100644 index 000000000..499cdb0ad --- /dev/null +++ b/docs/_overwrites/Commands/PreconditionAttribute.Remarks.Inclusion.md @@ -0,0 +1,6 @@ +A "precondidtion" in the command system is used to determine if a +condition is met before entering the command task. Using a +precondidtion may aid in keeping a well-organized command logic. + +The most common use case being whether a user has sufficient +permission to execute the command. \ No newline at end of file diff --git a/docs/_overwrites/Common/EmbedBuilder.Overwrites.md b/docs/_overwrites/Common/EmbedBuilder.Overwrites.md new file mode 100644 index 000000000..2dcb1e004 --- /dev/null +++ b/docs/_overwrites/Common/EmbedBuilder.Overwrites.md @@ -0,0 +1,68 @@ +--- +uid: Discord.EmbedBuilder +seealso: + - linkId: Discord.EmbedFooterBuilder + - linkId: Discord.EmbedAuthorBuilder + - linkId: Discord.EmbedFieldBuilder +remarks: *content +--- + +This builder class is used to build an @Discord.Embed (rich embed) +object that will be ready to be sent via @Discord.IMessageChannel.SendMessageAsync* +after @Discord.EmbedBuilder.Build* is called. + +--- +uid: Discord.EmbedBuilder +example: [*content] +--- + +#### Basic Usage + +The example below builds an embed and sends it to the chat using the +command system. + +```cs +[Command("embed")] +public async Task SendRichEmbedAsync() +{ + var embed = new EmbedBuilder + { + // Embed property can be set within object initializer + Title = "Hello world!" + Description = "I am a description set by initializer." + }; + // Or with methods + embed.AddField("Field title", + "Field value. I also support [hyperlink markdown](https://example.com)!") + .WithAuthor(Context.Client.CurrentUser) + .WithFooter(footer => footer.Text = "I am a footer.") + .WithColor(Color.Blue) + .WithTitle("I overwrote \"Hello world!\"") + .WithDescription("I am a description.") + .WithUrl("https://example.com") + .WithCurrentTimestamp() + .Build(); + await ReplyAsync(embed: embed); +} +``` + +![Embed Example](images/embed-example.png) + +#### Usage with Local Images + +The example below sends an image and has the image embedded in the rich +embed. See @Discord.IMessageChannel.SendFileAsync* for more information +about uploading a file or image. + +```cs +[Command("embedimage")] +public async Task SendEmbedWithImageAsync() +{ + var fileName = "image.png"; + var embed = new EmbedBuilder() + { + ImageUrl = $"attachment://{fileName}" + }.Build(); + await Context.Channel.SendFileAsync(fileName, embed: embed); +} +``` \ No newline at end of file diff --git a/docs/_overwrites/Common/EmbedObjectBuilder.Inclusion.md b/docs/_overwrites/Common/EmbedObjectBuilder.Inclusion.md new file mode 100644 index 000000000..eac0d9ca5 --- /dev/null +++ b/docs/_overwrites/Common/EmbedObjectBuilder.Inclusion.md @@ -0,0 +1,25 @@ +The example will build a rich embed with an author field, a footer +field, and 2 normal fields using an @Discord.EmbedBuilder: + +```cs +var exampleAuthor = new EmbedAuthorBuilder() + .WithName("I am a bot") + .WithIconUrl("https://discordapp.com/assets/e05ead6e6ebc08df9291738d0aa6986d.png"); +var exampleFooter = new EmbedFooterBuilder() + .WithText("I am a nice footer") + .WithIconUrl("https://discordapp.com/assets/28174a34e77bb5e5310ced9f95cb480b.png"); +var exampleField = new EmbedFieldBuilder() + .WithName("Title of Another Field") + .WithValue("I am an [example](https://example.com).") + .WithInline(true); +var otherField = new EmbedFieldBuilder() + .WithName("Title of a Field") + .WithValue("Notice how I'm inline with that other field next to me.") + .WithInline(true); +var embed = new EmbedBuilder() + .AddField(exampleField) + .AddField(otherField) + .WithAuthor(exampleAuthor) + .WithFooter(exampleFooter) + .Build(); +``` \ No newline at end of file diff --git a/docs/_overwrites/Common/EmbedObjectBuilder.Overwrites.md b/docs/_overwrites/Common/EmbedObjectBuilder.Overwrites.md new file mode 100644 index 000000000..c633c29b1 --- /dev/null +++ b/docs/_overwrites/Common/EmbedObjectBuilder.Overwrites.md @@ -0,0 +1,20 @@ +--- +uid: Discord.EmbedAuthorBuilder +example: [*content] +--- + +[!include[Embed Object Builder Sample](EmbedObjectBuilder.Inclusion.md)] + +--- +uid: Discord.EmbedFooterBuilder +example: [*content] +--- + +[!include[Embed Object Builder Sample](EmbedObjectBuilder.Inclusion.md)] + +--- +uid: Discord.EmbedFieldBuilder +example: [*content] +--- + +[!include[Embed Object Builder Sample](EmbedObjectBuilder.Inclusion.md)] \ No newline at end of file diff --git a/docs/_overwrites/Common/IEmote.Inclusion.md b/docs/_overwrites/Common/IEmote.Inclusion.md new file mode 100644 index 000000000..cf93c7eb5 --- /dev/null +++ b/docs/_overwrites/Common/IEmote.Inclusion.md @@ -0,0 +1,26 @@ +The sample below sends a message and adds an @Discord.Emoji and a custom +@Discord.Emote to the message. + +```cs +public async Task SendAndReactAsync(ISocketMessageChannel channel) +{ + var message = await channel.SendMessageAsync("I am a message."); + + // Creates a Unicode-based emoji based on the Unicode string. + // This is effectively the same as new Emoji("💕"). + var heartEmoji = new Emoji("\U0001f495"); + // Reacts to the message with the Emoji. + await message.AddReactionAsync(heartEmoji); + + // Parses a custom emote based on the provided Discord emote format. + // Please note that this does not guarantee the existence of + // the emote. + var emote = Emote.Parse("<:thonkang:282745590985523200>"); + // Reacts to the message with the Emote. + await message.AddReactionAsync(emote); +} +``` + +#### Result + +![React Example](images/react-example.png) \ No newline at end of file diff --git a/docs/_overwrites/Common/IEmote.Overwrites.md b/docs/_overwrites/Common/IEmote.Overwrites.md new file mode 100644 index 000000000..034533d1d --- /dev/null +++ b/docs/_overwrites/Common/IEmote.Overwrites.md @@ -0,0 +1,81 @@ +--- +uid: Discord.IEmote +seealso: + - linkId: Discord.Emote + - linkId: Discord.Emoji + - linkId: Discord.GuildEmote + - linkId: Discord.IUserMessage +remarks: *content +--- + +This interface is often used with reactions. It can represent an +unicode-based @Discord.Emoji, or a custom @Discord.Emote. + +--- +uid: Discord.Emote +seealso: + - linkId: Discord.IEmote + - linkId: Discord.GuildEmote + - linkId: Discord.Emoji + - linkId: Discord.IUserMessage +remarks: *content +--- + +> [!NOTE] +> A valid @Discord.Emote format is `<:emoteName:emoteId>`. This can be +> obtained by escaping with a `\` in front of the emote using the +> Discord chat client. + +This class represents a custom emoji. This type of emoji can be +created via the @Discord.Emote.Parse* or @Discord.Emote.TryParse* +method. + +--- +uid: Discord.Emoji +seealso: + - linkId: Discord.Emote + - linkId: Discord.GuildEmote + - linkId: Discord.Emoji + - linkId: Discord.IUserMessage +remarks: *content +--- + +> [!NOTE] +> A valid @Discord.Emoji format is Unicode-based. This means only +> something like `🙃` or `\U0001f643` would work, instead of +> `:upside_down:`. +> +> A Unicode-based emoji can be obtained by escaping with a `\` in +> front of the emote using the Discord chat client or by looking up on +> [Emojipedia](https://emojipedia.org). + +This class represents a standard Unicode-based emoji. This type of emoji +can be created by passing the Unicode into the constructor. + +--- +uid: Discord.IEmote +example: [*content] +--- + +[!include[Example Section](IEmote.Inclusion.md)] + +--- +uid: Discord.Emoji +example: [*content] +--- + +[!include[Example Section](IEmote.Inclusion.md)] + +--- +uid: Discord.Emote +example: [*content] +--- + +[!include[Example Section](IEmote.Inclusion.md)] + +--- +uid: Discord.GuildEmote +example: [*content] +--- + +[!include[Example Section](IEmote.Inclusion.md)] \ No newline at end of file diff --git a/docs/_overwrites/Common/ObjectProperties.Overwrites.md b/docs/_overwrites/Common/ObjectProperties.Overwrites.md new file mode 100644 index 000000000..e9c365d39 --- /dev/null +++ b/docs/_overwrites/Common/ObjectProperties.Overwrites.md @@ -0,0 +1,174 @@ +--- +uid: Discord.GuildChannelProperties +example: [*content] +--- + +The following example uses @Discord.IGuildChannel.ModifyAsync* to +apply changes specified in the properties, + +```cs +var channel = _client.GetChannel(id) as IGuildChannel; +if (channel == null) return; + +await channel.ModifyAsync(x => +{ + x.Name = "new-name"; + x.Position = channel.Position - 1; +}); +``` + +--- +uid: Discord.TextChannelProperties +example: [*content] +--- + +The following example uses @Discord.ITextChannel.ModifyAsync* to +apply changes specified in the properties, + +```cs +var channel = _client.GetChannel(id) as ITextChannel; +if (channel == null) return; + +await channel.ModifyAsync(x => +{ + x.Name = "cool-guys-only"; + x.Topic = "This channel is only for cool guys and adults!!!"; + x.Position = channel.Position - 1; + x.IsNsfw = true; +}); +``` + +--- +uid: Discord.VoiceChannelProperties +example: [*content] +--- + +The following example uses @Discord.IVoiceChannel.ModifyAsync* to +apply changes specified in the properties, + +```cs +var channel = _client.GetChannel(id) as IVoiceChannel; +if (channel == null) return; + +await channel.ModifyAsync(x => +{ + x.UserLimit = 5; +}); +``` + +--- +uid: Discord.EmoteProperties +example: [*content] +--- + +The following example uses @Discord.IGuild.ModifyEmoteAsync* to +apply changes specified in the properties, + +```cs +await guild.ModifyEmoteAsync(x => +{ + x.Name = "blobo"; +}); +``` + +--- +uid: Discord.MessageProperties +example: [*content] +--- + +The following example uses @Discord.IUserMessage.ModifyAsync* to +apply changes specified in the properties, + +```cs +var message = await channel.SendMessageAsync("boo"); +await Task.Delay(TimeSpan.FromSeconds(1)); +await message.ModifyAsync(x => x.Content = "boi"); +``` + +--- +uid: Discord.GuildProperties +example: [*content] +--- + +The following example uses @Discord.IGuild.ModifyAsync* to +apply changes specified in the properties, + +```cs +var guild = _client.GetGuild(id); +if (guild == null) return; + +await guild.ModifyAsync(x => +{ + x.Name = "VERY Fast Discord Running at Incredible Hihg Speed"; +}); +``` + +--- +uid: Discord.RoleProperties +example: [*content] +--- + +The following example uses @Discord.IRole.ModifyAsync* to +apply changes specified in the properties, + +```cs +var role = guild.GetRole(id); +if (role == null) return; + +await role.ModifyAsync(x => +{ + x.Name = "cool boi"; + x.Color = Color.Gold; + x.Hoist = true; + x.Mentionable = true; +}); +``` + +--- +uid: Discord.GuildUserProperties +example: [*content] +--- + +The following example uses @Discord.IGuildUser.ModifyAsync* to +apply changes specified in the properties, + +```cs +var user = guild.GetUser(id); +if (user == null) return; + +await user.ModifyAsync(x => +{ + x.Nickname = "I need healing"; +}); +``` + +--- +uid: Discord.SelfUserProperties +example: [*content] +--- + +The following example uses @Discord.ISelfUser.ModifyAsync* to +apply changes specified in the properties, + +```cs +await selfUser.ModifyAsync(x => +{ + x.Username = "Mercy"; +}); +``` + +--- +uid: Discord.WebhookProperties +example: [*content] +--- + +The following example uses @Discord.IWebhook.ModifyAsync* to +apply changes specified in the properties, + +```cs +await webhook.ModifyAsync(x => +{ + x.Name = "very fast fox"; + x.ChannelId = newChannelId; +}); +``` \ No newline at end of file diff --git a/docs/_overwrites/Common/OverrideTypeReaderAttribute.Overwrites.md b/docs/_overwrites/Common/OverrideTypeReaderAttribute.Overwrites.md new file mode 100644 index 000000000..29b547e49 --- /dev/null +++ b/docs/_overwrites/Common/OverrideTypeReaderAttribute.Overwrites.md @@ -0,0 +1,24 @@ +--- +uid: Discord.Commands.OverrideTypeReaderAttribute +remarks: *content +--- + +This attribute is used to override a command parameter's type reading +behaviour. This may be useful when you have multiple custom +@Discord.Commands.TypeReader and would like to specify one. + +--- +uid: Discord.Commands.OverrideTypeReaderAttribute +examples: [*content] +--- + +The following example will override the @Discord.Commands.TypeReader +of @Discord.IUser to `MyUserTypeReader`. + +```cs +public async Task PrintUserAsync( + [OverrideTypeReader(typeof(MyUserTypeReader))] IUser user) +{ + //... +} +``` \ No newline at end of file diff --git a/docs/_overwrites/Common/images/embed-example.png b/docs/_overwrites/Common/images/embed-example.png new file mode 100644 index 0000000000000000000000000000000000000000..f23fb4d70d797dd65e40fae54e84cd1935dd8608 GIT binary patch literal 15290 zcmV;rJ4M8aP)?Jk3<(Sx(&hyMfxu@{{;z**>+I;@uT|xvfvZ5f`_)0Wi2B4(D%&lIUIhYy z;9D^a0s;a69st@rUMk%J>XUc|43%vUtuu8FRa*jqKro~P4C5bC(&~UnU^Fla7>+A= z^jQaoD&iE;ra&OL8~8r(6%g!x-|6uhbkr$?Qy>uBOMD+!qzSJ1PR}{d+b*0#Hsluw z1cF=0_uN0P019vk*L-IHuBdZRh=@}l5Zp_I15Th7I1hy48n*kSVM7%uiilGn5Zn!n za=$dd2q1);SRfiI!4nauKp?mq2*EYS845^ri{>4PIEP#~gNDKQQNz)N_Lxn$c8xKi z65})>1P*nl0)gPWP5=<-@e1H3gwrn{?FkNmN1}9$3US>raHYKihuY4tVZ*pDB#0o_ z&8&Rgrt;@6?R4JsgHr;5;2vWb-D24#m_7%7ekq*B`$t|EO@QG+fea7o9beubDq$EE z%HLbtZl`$yf#4p;?-q520s4_4gRUPnDwJV2|E#`1AQ1SB-$k4OKuFLqu3fvvuwes7 z&?ABa2pSf^)oZ?p=VXfhu$V--yF|5_IC)?*Zy#vrF4RBCs@ErC``wGYQtm_ZcbbL8 z?8=M2{#I!`&ek{9aoFSq$JSdrG?ZLtI5xZW_+|B zooBoM`D>m^k+Ia9sJF;G^z&b{>9@JpYhy`z)B0M|V3 z@Ss3ONxDTVwpJAxLo zjqy5<@;MWU(^&ZP|2?1ORj#6Gzun8P6Q?qhL+sWs=f!E!ILiJPQ~u?Ut3rA)``(<& zi!W`Y?6pG_{r5vRbhYRYM|e?F&AvBo_L>BOo5Qb!Gh$>2qe6!f7CM{<rSiZ=ir?rOe#S6!<^RL88Bu5?6-Q$=@Bi)yhG%9IrvWKr z3%mZ%HJptgXW4R|%}XXyQn8sT*z~I+c3Xh#LN?8Xt-n{8zAP7g{d&qY`D95SFn!4u zm-$_`zW1C_VZX<_N3*^>h0>Mq=S3~tr&s`)td9)lqYz1DTq5FO3K3*V(+k``NiEf;`!Ym3NFR4ILiWy z?2@Vf<6Er$qlu7|*}Ss$N%VNL%}U|p6G;74ITxI@yqh+G)U+4*bBmKx|9b+d*F_UD zRxBk)-^A{JDegV*S+$O>WfpWft2ue_T{dlhmsxrfyWS|qf-8c>Vdc~fA*_{C76<5} z$m!8s#RDVR}m*btlo(dpdm6MoW#*V{8#62{_(%5w1zVwESA&OaUEQLp{T>gI?Ckru`4p7{EM;q|hL)pmaZ&-Qc5pJ~ z*Gx&74Z!qN4J}7sWYJ33KlkpnU9H5Bm7NaeA_`XmOlD0+G}LS+f2AveJnYm{`mdQR zdK}6C&_Mm0%v-Y470sGzc`hT3tc9@Yy~#|E)p4O_ok#SgV5v88K^IMk#z@?x1-wvF z!P`|!-F6l7;@WCpFDG?d*gx%OJjZ;BUh8R_n?xO>Z5FpJX^hs{x!}2AmR?9fb_Dg? z=CitwMJUywqB^PLjNz1R#Z=yP;q{&!y{eRKCe8-*UlAAh;R) zN;m@pIvFm3bj?QVB?t2N;E_a?=rJ99XqLzcK10k8JNWhNHWH({H!^Wv9l8gX=IOQI zY~n&6#~n2vxJ45{Mgk(!ms6B}-5Q*Y5+EVrprvv!5s?;2f)?|-?xO7$F8pgUxqWwC7J+LJ2}-dk*rDc!IDg@&PM$K&pAMkIZpjjwr-!z^o5goyGrh5m!;m0gBbL4 zfSz-@DNpjt#}m**Y5|p*D~p(k9(@S#co9X3hbVdvieH*aq~##RrUY`b6F}qgL1gx1 zGR#LXPkV)e9GS{jpW?+mR?ttT;5W<3U-k;NJx{UPVrO}(+-ucb7b1bfMyW@c{-sAr z3bF9&S8Mf0q>o>kFezP{P}O81cuy4ovDrZYrB!9OQ_diLzr!V zR5dasdm=@75sYrBrLeDsABzQt3Xzg~&Y`DWItd8{+c7Wa>Wsw28qw=@I2DE1SR+VU zMmtp;u|^U@On@GP&IwGWaK&Wzi6Ic8XXc7RQV$$qUvvZ^Efo~+vAS(K!s_2oCg;s$ zV&?#E@s7Pgyq_c~Is`|3t;Zr%8U^V_sQ-X9RekwJAh@;o)f{Jg2h3hQk`K#Nej4UJ zbM%0IGR4^mgtXMU7NUCER#MEOIjcBj19QoIX3d$;i!}-~9%0s;`ONyaEx;=BCr;*J z&sRw!II3AQaWeU@LA_0Z$Ycs1k8$@9!=i=BjK+%j7_faapSEat=$S5m#jt4YVjj|1 z`1C!G$a3Lg9*%T!s$^B~6@7u=HsMzh=a>;8d|%tazx?b1k?!E=!RSu*{Etg~c_9F` z9e$E{h48Q&XEXzDa-^yWeQ~25k7=H6J3OApi5C8{f z_P+&GQ}o6T4F5ix7dM~aMfb5!e+O`!()tA~pR}6F3KLt?o?`W{){(mQdGa@(ARoYK z;pFfBgH8Q)Z&}63nq1-%8>#HINTTPF-~5_K030?>AAXC1H>`m5y3MbAaDrC=942=C zs>m(8UThz)FT;{|X5<-a6!pYzLFZVoU z1Hpiw<#-LF!msHT_ zOoc$;BOUGSd{$NQe}HDd1bpuP*$mil?F2t4{7yLkF}97>^L@XyDD!_taJ9p)W*%-S ziOW_|lx`%_AaUyd%jLPd_C|ey;Px<-!s&NPQ)U{@|M^?+z!lx7?Xc*b(f5>S0@So9 zsA?03Uwu)Cra*9;@vAvbfX-{fc=5e4EO_`Li?b9$g0HzBwe05FwQIC@4&$%pV1Btn zi*n^2+|qb^5&1$e1%f+*-w9_In@^5n=U+xLTJ9t!;wr|7c7g)0VLl(kX^X^pN5H)) zm;!;|j^nq&3E*rGr1_gbn!gF==zra5YXky;z{R~aF(?oS1VexjPJuum@DU-L0)ar_ zBSJU@0)fCsgm4N30)dYR;k>5_?c;ZUp+B4a(O$v5f}aSdkxLU^#uj6|(}wsLfhk;$ zo5K|uI>$VQV|*H}T}UU;n*B1Z5j{`v!H?P{{B6;%v1@ zhp#4#W8_Dx8L5J6s5+A?=MSPg{W*lq;rygjzLsHlb0zu{+X?OfU zIkSoT!e;YL$3Y@0tAJ3hr2c|St$Wcmd;x@W`NvOj<@`3ZXU5T*ZDe>!CGC@DVpB_q zDm&4)jS)}rRlF8LNAXqm%gCo*CCmzhX7SCW9KOHTmwlzI@Oxp|nRW;6iFV7em_!ZTbxTiS51qSgytuV2Lmjb#ylX?J>W=9`+dz zRF=Aq#~1K*;0Yc$RnfP90B6$6Tsi+HBg2-^64yrfhiiL(qs!TRlQ99?m{A0_o+Chl z>sg9A+C3@`fzJej0k{hy&J@0Rd@;?knXwn*>r~Bj&N7~yjfgO zD;fXcyF8$br~a`eT<&%4Z3H!yx&*831jEmtyWyx3|1w`?d%mX9>bYjppAY(>bNnx8 z_{n$zPi^D-C6x@1$fV(?GkeVy2Dibb@kTBI@I#a&BWL4N-Pe)D#UG8Qv+eW#{R6a* z9mlx|EBJe=j?m^hdhbAx%~y}j-~uMbezc7Tn%eMEX;3~B2!;ax7tW|hu*f#Xmb}Yw z`{xX=T+R2aqd5DcslbQG%~!ESO#q-X#>n}$W@Ib0Cp}0@hndl*n*lo`D@|y^3|zWC zFE|34|C1klw3db<>w5e4e76+@j&1>l&GO~-M~KZh7re)#u3nP zm@y3%1fAc_m_OAK9FfY!upU*LK1bIP&ZQ_oPUm8%jWKQGXo~=}@q8m$8QIh}z-Q<} zkuEZJPa$I}OM6AOo$(Vmi;3@*Y-YH+k>YuZZ)a8(M0Py=TlThiT@deI|NIm-iO z72U^_6NI&CS9)nFs!|yZc*b02_P#LrcN5 z5y81U58FE6ejhh`lIvdOfg3i8Pr*KGFec=)Ngxun=aBAHJ9Pqi-djn1)*&={uVVCNelP?>BP<3=&gRo8OCj0&4|Hy;pXt! z2LSB^0BV>K*XG!O6v|aDGqSaJ?Gb0r(vkWPd>u9l-Ki3S)p$B5q|(}^nedzBf^x!-es|gg2GCE1W=X zzRcG@O2yWC2HE}39o%$|QDHyi>nQhmfj{JO#u6O;3{!&|&M+#%h($fe2n7O~%-k1Y z#DW>QztlSe+6YL&blgyX9JZtscR@H;;|lm@>>zzINN&al@HwH@%Up<=ifg-54bC4w z$oaNrMxOUl{fr4+sFCI|=NQ=pSnIei)JXFf8}~K1=NAX#pZ>0+`5d8R9^~r?jmw_Y z8GPk&4ec>cb>GJ+5Zng*KjKukqdz*1Gn0P7=c%ruk!KDwzOH-HKcvo#6cf+L(;o9< z*7bbv)XOyfs*nMQqHK>RIZ%=tnXpsU~FtQ z5y>OeEqa^Lr`{y0va9}Ls!|ubu0c7A;Ugb?GY~i910dwYZhr9CT z*7xCq66EGbXb(N>ewOD1a`RN$Lrv~G9T?PS*e^}Hi9WN0zyI_V8Ufi}$pcp1^+?rq zAE%v>(EsNo5DXE1m#nRyF6aymhc>g1VX}r!SqF-*=iLkg*cdt%+M0XR9|x+5fB|n2 z`ZnC84+6*1E?p$3%`rrF-0WxQVNal)AXN;@1->(s$=dus;=E290d3}+IL|?VGF1Qg z12KS&H;86e{o8S$;Z6FWqnV%~)u@~O4Bd1z6Ld?zU<87};s0}-0)ar_X9(dG2m}Hj z5yB}D2n0SNgi|082z*2cr$8VO_=pfrfj}Ve5h0ucfk5CRLO2Bifxt(Ea0&zhfsY8` z6bJ+YAMqRE%v!jVMHBC|6@wssF~!TCyiJ|OF!SlfOuNbCpK|(qo}H6MzndWm1OlJ& z8{yRJBGBpYv=#n_4xK)NNZnxSrt$2`BA!j}E*TxI!w?z8=v!r;KyZ(87j5!!FH*t! zl@$Y5>jU%lwwmxDfp)4@YZJ z?X`ToZ6{@xc;+q1#1JCEq@@%j*7DAVBPbK+^Mbybx3|~1j5X%+>@=5ORC^Pj?%&9M z6F?@5mPByss6y%heiH};el%3?n<#WT2lYocQ@mmwyUkisr{!V*&}fKE%;m)lIQiZx z)*P@CnX-VwC!(<(-OQQ|6=2LIKfQOW2Avj%={TESD`L%_Msz7tnI7$>-kincr%RYi z)=~W4Csek0Bzll@d2VhRRIa0N#X2fUBY)v!*PLSBY^ED5>|0wz@rEOuvboQbC-cI> zOl0#R)~r~?`lB{eHSu38LSS{uQMeMEuuu`f|CnwTvPM#5+U%&WR%8g4mWn4lR%`smf}6tu4t}&CvSV$CRvV9yrC=7>pkhK z)*oW^_G$pk?;R&;WiF}d3hT@5t{u^Bb=1`M_M)6;L}#zQ-mhi*Mhub5Ny?KsydA*K zsX_QnAQ0RY!s!|+Pfw3Rqq>I58tnblR~gLsQclPve_9#_S;b~okYv{u&^MBRMq{U? z5AjISXpsz=6tB$eE_B*m=^M5my7;?v^XGDli+?oIKK%5g1bRDCoUjA9S*N8qSONLBn2xq-?Gt67R^nA zl64fiqs4j4ityg51TtPl#es@ie}uvf-WG5g*uP;F`;jrE=Q1;IHu<(9P7W@o;~7f>9lf+S&Uw4!vSQmop+ z$BEA~{iPyO?Ft&L4EAa^9RN8oll-|eK(S+!wCL0(_8kS39qckLCVycOadrhsD?{TE z3Tqn%Ww{iaOYzEF_d7e4+cvxAcd6i1<7B4i6;V8?iG8nabeDVDx|r!pib!(XYOC7J z`l^BZj7>}?vSlZS2T@lbxEHufvRuj-5~8574)YMs!^zR{7-*uVaiB&A>OX?m1Q|zd z1C|~~^u~BJN*(n*4-i3Yf)>?>Ysz@Ki0K^aV``wQ!x&;|@Y3JFwh9E_W$wW&mkQ?E zfrpenx7t|eURnRP{adN`vXTv8G1c`UP*&<|t%K^_CoB!r_gkTFTLl8a;J8bKQvl#_ zG*RCu;zWVqP9uc#E}~}p#z98N0)gOG;{U7a0)ar_X9(dG2m}Hj5yB}D2n0SNgi|08 z2z*2cr$8VO_=pfrfj}Ve5h0ucfk5CRLO2Bifxt(;W5OAMzQ2TT`Uo#u1K*;)1OmZ# z7C#Zr$rSxz3%j;^zTTlI8_++=s{dTWF9%HHP{^)|U95S!kHd4;Q2N1Yo*Rrg1NJ#U zUjl*PJB^N(Wj=8t55>k4mvQTQFWP>B(zPDB(tGx~Vhfd@tYO}*GeIB_ z+(r1+v+9oe9n4y?vq$NRWNp9AhHSqBeF_AEy9PgrIQt>HkWF2~c7XJytl55ulgExw zx_uP|*%5u57(vdmRqQ%=h?B<-vG0lQo!dQG^!gSu^q`5I&93dmEb7_k!eVx1M1UrS z{OwymtXDDa|E`em1;ryX;>37a#yR~z%z7LlK*Qu;OBhfq&y)bDWjy$m%u6>47W(dLDkMkcYdOs^D(If*sBg9+7={=Llf8(}vB@hVi zF#a`EABY1cS}>CJ`V3+L^vTRy`7Udg^{lv)dJ9CRJkKH{V4TmIpU3x+H{FG#(f7Zg zBgsU1t#F9?7Kocz%uFLd1gUe1*!tV0gTF3;KyX)acL`@z5ygKrp_%kQc)#KVl^?8O zd4`0|OLnr=zx#mGB=F+q6I5BR4A$C3`X)lIKjui zo!sMKHHEKzz-i4y3OApivSJtO|1}NCX8M*FD-a0$mAfQ8a8DvgotS`RIYQY0`V^a< ziKg*5l>_EDiyrs zd_)MRKp+tKh!9SJKp^lDA)Eq%K;R=nI0XWMz(<5|3Iqayj|kxu2m}Hj5yB}D2n0Uj zH^P~d2qKv1DD3~);)~507%B8n32T?rp zmbkCq7v?Ob`02D;V$oem*fX4&wS=p8)QFi_uiIeYa_Tc&2_3{~eqj669~bktjFiFE z&3GMa%q=#^lZo>wczOnjx3No4{N|BMy)FXDwwZmE-DOH6po>Bmt;e8)GUbk$cbn0m z(MQnlc1{9ZUtqa#posO}9+wRart`Mj)E`>ZvE$$j3?JyJXn(Lh&~N0SH+mgfWzBqdM!TsqImy>}2(dJ7SJNFvL`G--kU@3<&N<{7N{zlgXkb5q!FKr|a8ApT@ko zlS$G_sPzBO8xFaAD5o)R zVJ1m>85Aq0j&A1taxVsX_!`BIx#knrAE+a7&hun(?E3YQ@FXv!T6z1ul-i=1 zk{*RlwR5Uu2k)0#-M)GreSI}#xZ3UI4`VLRPD{q1l~C!6%GaT7=>GC9x-(`v$NvJGbdWKpySCQ~ z=kkx|($VlH8g(YN@ixL*ja*2L=TgU69yqZcjotkR6qtfz!VJC|8%l6p%SmO<-9cJ_;Z!)3{z<@JuDi>qM z@pV`b!_R+C_@6ct(gDabv5h~6?o24(Oh|*j{DzS?*zh2iCOkst>HkD?-VPYKlKL3u zqr$n?c8=kJ!EoNg=VPDYLaLE(Lfg2n;m?e&EF}PNCKYhy{A$A7d-Sx&{DO<>HndIW zT<1kS!#9B?XwQsu`SPz9Q8FfA8xzdPzwRZX&b`r2qkuUN&d7CqA!&UbBUd;?L;duBEdON|^}yNXSRt7%ca z_i1)Y7-Dm;zc=J1V{qCj0}MJX4%2Zqy;j7UJ&ov6rZPRccN=DP`Y6q>q~4H@)q-KN|$S*NX^ScQ?r9LYxiQ7(#U@%*X0j6mx6_9NajPV zS+S0NEiw-;e4ZQ`AOfAi$gHO)6WMZ{((*4UJ6cPNQ>CTm6F%;1e?d8(FMk}&sFIb$ z9x!ux(p)Y90j*cL7@tLZS3M~k+jx-dfE3O*sk8Vp#?I&i|IYZbb6ouCa$3Uxen{(M z|HLKhW`3~sKZvxB=gdzRxQEr@w2gm|md9psrTHNDH}^C~gEJ!hdY|oM<1yzg;L`bn zjNA1p5p550w%43uD9+TEX^gQE)lakR@OM*Zm(Vz;g)yzN20%$VT5{&2pD%jV0UropKX8P)39OB$_@E#Mpb zpWUJv&gJYSSVBKX|KWcy?&t|ZJ3OjK70{3|0{KrXiQTo0kzrH$`-Ch2f;&PvACu*- zn8L**17F3vZ6KUWNk*=wptv91hRZ< z#)IR$zhN(>CM#$pS}axw@sd%~Lz$JvY7Xx?;)*uYlQGc5;rA*qD+=b4jqGcbh@I4X zQK?%R70gvf*j-XLI1`->?0aJ;m5o-+&fsJ1$4YMZ=9o3z#Oy^l5% z(&hl=Ge#;}oLa#CXLO8533FBJj4`4%9q*3z+Ukh>({6%P2Lb0d^T3%<>~Rl*_7N_q zl{|3T1hf%!`p=A(jX1hY3=Bm+v63+j6$GgRZ|`_t<*VqLJ}02#9K)OKw1$np;kcUm zGH1us5q)5DpTooZ|N1K0rY`^!Bbw|4H|-_jR0RPY4uYD`5h{nf7nx2lva-bGi@+cP zo0>rm?`|mcD%u0T;lAe23AiqVMp_@6N!#h)Gq&z?SCKrG3t=Y4ohTuwqm6*J3Wm3K zEn|gpDSjOHRjy}*;((4X82P6YjEYKkePK122p#(mI058;Kxs4afNbOv028<*HzQx) zG1AJ|58q@&>p4(M7|}Wc)k8RKj-~JL&l|>$f3g(`R zD2Xz%-9p)5I#mu~wl62{ahd&9X&7WHW$q!joRCZYv@{H|ip{Pd$*$c_eIZGsMKWYk zywW2oblSb9DjpoJA^7w}Ehu(us*G2wwjbo=(?4V8vSMaBt(eO{Ve5f9lxP`AvEZ== zN2NnyUSt$-<9?&>@2}w5CuUIa`V3S{6DJSvV1KRea|~q;JJWUD$?H^4iBpkE04L4oKB>eKXo|c$-q_kB+{ggD)6$`YLDQQ@F3pfg>&$-Jh!ZJTLgXosNi6 zpdCf)7$Xh&sUAl!5+2y~yPc5pgWeC9z>a?EN=BOFZRmGx@An_IcN=}J#cQ}4_s=w^ zhC}N)MyR25a<=<$n;oe~Q&-2Q)6!Z_+-Z-9J|dh8iU}`yXn`N%l&=!h>eX8QEc=t+|5kFrd9x>;8gY3Fm+)fUTC|*LHf3 zERY0 zn;;Js!<+?7H#D;KwYOaJg6WGX_IeLi1N%3uVm~s5^jv1<%_iSg#CnBZzH#O0^x`Sg zA=bZk2;?X-@_xqjxwEmY*yyv(i5eNyKITf$qCv%Barw#{s@KHM-=2VmI)*=r9 zUt?liYu|O-!$JvEFM@iNP-{7{ANBVQKSZb|qRN7?{&We_hihGPk>7&O_+Rk1C=)ST zUv>TCYnR~oasTH8pV`aUz#N(~nlY4}a20kyP@mG_Ag}{E0zJ!uA+U`=72q5r&s^s0 z_%wneVC1Pbf)zWC_zB2_Gpg>y;4Y@|7#~{(x0(5^z^{ht19G$xiyX}?kNG(L#9VTE z&O4S{u*uO(@2Y3aB{jOAbiD^^Y0(;)87Lqsx~4<)Gk7>!rKM_+Qv|-Ee#rgj$8sTK z9Koj#_8mn8PM~#sC}9nsLz4-eHXeuPy_gZ%IB!ul=)mSTi8?ik#>bbqhPU5>j<8V- zKmWP=IyGD!8{WrPl_wV&equdi!e(+N!#&;7dHcmGXfP2NHI=Ue&4j9e^)v1ZdxWpTJcsE6ppPagB>}@As}D7IS;V=Q zedW)Szp#iRyB)MzB&CUcJ@4>n+{x~mr7T)lM4SqeWXEh#`WYS{p~jNQG@WN#6|`6u zld*C+21Q0k6D@s&ucc)TJp9D-6t7eP1#^uRM^|WCwS$inpJ)0@MWoslG+G(#)oeNd z`ov^Xv9h~-@N+d~HBC%;Vg^OaGC`}w(P;Pj$1f*ll0SEbYd9}y(Wy=BI|?X=*jFA+ z{@mr)edugF#F_&=FHR7v(rFa&vt2H%$67>`D&qrO+gLHe-IzWOLn zUrccx>|5bo#O5t4CbFfl|G8{meWi~fmIg1^I0&K&XoxWp^QRBH%d|`Q+fN{B*II)6 zJTa8c&~Ruo-(|x#4W05R0+e1${x?B5?V%9VcFz0Zz_GMT7YS;+HB&9VB9gVCV6Gj+ z@J(szeM7ykJvG)1?&*X9`?6C1Ep54(wk)Q)KE!8`KJ2rvp}d}N*|w#j&&;EJ^Fyvi z#q-UN!@2*&YM;-BHUiqrH*wyb#zBBGR6=%+p#G$$qq+a%cQJRVa0>huhXb>zsn1B! z($awHCn@LEvEd9q@q08q=hf76jIKLNpx3hm0wJ7&p{8~x>-&ioOSk*JDt~MEf{|rk zct519*EL8I*lO9m;m{4c;AG5M zN|vE(n@es z%;4D!sJG}yjdi7tICZ!QT}CpI8gQ78vvp6k#}F%mjK`;vYLH!j?hXr;2X@|&88T;K zCI-osG4Wab4%Qz~NX(nflvo*1vDF`A*8x|COT)w`$w}3t0UYLP4(~aR{P<$B3=$HV z6g(Zpz72b+kIrOXw#z0QCU-W+cxFDGjCw~ zpMq$Gk2mb4rq*NECrLt*)b35@9V#sYI>jY|w#Lnzlzzr^eHt=dSu&H+Xux8&po@$l zg9=wPs!t|TW5L{_BR1sb)9nfFe*AlJ$fDw~RI_i}Mm8O81VgebFgG6v&V+iKMAFzA>F)UqMjQ8R9Q+5YBy^%x!Ig?1ef~~5@e5k`p{oxN> zec5D^GIF8vIQz_Yur;!8|8Y(Y+IE@LJR>?sBd5GgH)PMJVA)a%ex3j|pRlVO&})!% zMi#xaoL|1QoPwuwN%W?1`eY(?c3P^e)YMpT=%dNHArYU7(^QSw>54`H64Rs6*qS)0 zD&0Ha3+_q$TR5raWR>blF_GbpV!B31Y9nRu9ihflfkOqgrJCL44bFEr)|F+| zsD?CVJ&}&?hK5|&8Wo&?Q)!^yqVSMG4=vT~H!0X^4^i0ydP6d?v3fK%6Z^{TD3;^w ztGA=k8;P_u;BYlSy~&DVG@{plq@PIs+=)a=AjuKeQyDwzKVbcViUAfFuHnu*>!y=y zUdQVFU^JrF*g1Wm0-Iu`^neMQMo*lP?rW@V!fdL;c|ElA?sui635!NgTms0G^yq9B zPWIS8uKrjx7jy~aJTaBnt`EW9M7;{2Qa|X$Dw)K`XOk7FaO%Kb*Pf^)TUfneZ}86-{h9S<%3O4|xBNn_2VPDqi{hLCjJDS=qfarY5FGqf?!blFPJMP*p94 z^saglXe1TYQO7BZf?l77OgwRV30wVfEbe(#9}}JmzC-x8aHc%Ta|<&u(8S53rt5jV zeJ7cD&nzG-8q8(K+~V3lvbRNQNk${N4s=ZeC;%Z+?-T?Yi4YXbM~_i@^cbZj2iaXx z;T}S&I4pxnmvN1&&NkXRJAqC*+OKfc*Mwaf$@LX+gTWG#)W-QYTjEr=%39(XQh{VFl4X(L8c@PcN+Y}^Clsg$z z6b6li%~DOJ#fGZUk|hJkWa(s7TT|~{;;XFKkQuGFQ*Uymb%@mKz1~)nI5C%;6fe2a zfp*1;YbEBuouYSE}R%(Y-~sNL5XoylnTf_i^`FRQmf zWF~PM3+AIeuO^vDox$R;Gizb?f(t!lIJDaKHIA)8MxKtfZ zORej3R@6ZxITL)B@$1E*N>d{l*_jk9O9Q8Z<7WR_s~Rw;PbO>GQXWRdF^GohOO8=L z_fh68Tk85JahUk{s1=msR2rs|@y|<1RRO1s$^))d*A_*A#K{yaiK2AvUP`N?n3=Jd zf>aeGa9XN4eXO^18e$WOb67cCbt~>2Jx*z56w@-EciDl8t@5C2vEx`Zv5%*@uTjC~ z_DjEhFR#X&GL=}RiNn1vrJ5F-k))q5B@S>nJStdhI1&?hZkd+Tzu&_CK7-L*auQwl zVJ6L8P7(krma@0lq%o2d>%dZCL1#!NCnL?Z!YxT)sb=>91;d<2$(lB`yWD1?w8Zna zA(@<5Jy?!+FHiv}M=)EGNsY~f8bEcpqiKbc77MBR5Kfo7=X0Haq!B~)dziZ*S(_G} z){bomZZ_6wwb<-FHl&R}uUdQGm@h}5m#kO@Y)(cWE#qkPeiQfYLq@Ncuy`?8r;osC z>3yTOcfZFobIGGv7BZ$?@UT$y~H>nGHbB`r!8ye9Bd>2gs zyVZOC9Ho!)-W9Rj^jzOiqG0L6V4KBTr0d1++4Ct#)Ptjz-F=8AfO0c_z8MrN^@(BnBai~Yy@C)huui{d12d?Kn!|2}h@{0R+A)Eq%;C9j_oK9Tg zcn+6P+Hh%A8!qj-BSZBrMQ;OI-G&W!A9Lc0IEMp)h?RVSKydr$n$x^Ocf{G^{@IF4 zv$}@sgJvirPEX+sc9&mqzt;ev2;me61hi+#a zFanSe!YL34ZZBQJsREaAiD#?(rMSyGxI@C(Wneq5D67dRYKYbQVfj}S-2m}IwKp+qZ1b)f?4}r;Vd`8q4bN~PV M07*qoM6N<$g1w`ROaK4? literal 0 KcmV+b0RR6000031 diff --git a/docs/_overwrites/Common/images/react-example.png b/docs/_overwrites/Common/images/react-example.png new file mode 100644 index 0000000000000000000000000000000000000000..822857d3d108f151a2c7b3e75614f8830373aa68 GIT binary patch literal 8994 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⪼loMq-gGE)-~p+V*1(Rjbk8^?DK$4McoeYc}SER=2PBYhT}Zs>#K zd-~(U+R-Q}@I_Q)IRD4K9+1YnHEHj2-SY|9UhGAG{EHj2-SY`~vFf22MVOVA?Gxwm0h{2@E zIz&Xpc_gBL*JIxqmKn>;#Uk@m5nM;#dva5qek@8;i3L(px@o~one`= z%sfbD^Ao3`VyX$V;tfcQPLw{cPQJU>gmB@$>o6@P4y6lqI8qmnAKpmB*|!tX@drIl zyqSo_1UvLS$b|FSPPe)*S2Sy3~6;LS~Q5io-t|lF;!^ zGS0u74E%A54PskoYcjq%kchR9#=1>tEHjoF%glpi_UzPb8=2XQ?V{R=Gs2u#fP%bi zm&!~?X?bA`et11m64u#wlJM=TI(*q2gX3=|;G7~hvCl#~MQod%h((M}*DHNzSY|9U z50Tl@q|9z*wkPer3)aufn~(XAERreAcd5+G8L{}hIYE-tcdx}`&CLFolXR2B!)do* z-&$WOB9kJscSPitBz-t(j3SVyu-lA^CuZ|U*c#vrs*2H=y1$#`e$1T?Sn$KQ5n@mW(ePQ9%skxfxZ#+zH> zdZq6S%Zz2#%QBl5n}mEjIpxGnl@QXh7uqvZOqV1@cgU=5cRXN8C5f#|hvUBJ8?fTO zK3JN48)hZkDE&S=@kTsmx)pzVG0ZxqcKnTmUgH~^2|b32Z{thHUTL7)F`UmVMfVVPY| zG83ue#fa?Vi(Q7%i!ys`ZURodm5lSPNjS5^2PdBX725X(NxyggUWenm18{hQFJ4_A zD9vhGWY+PABy1{TnK3N0>q=%lts_%&r3+-;A+z{|IJ~|k8ST6LaQx|C;&}NjIJM;t zoNXMBlk5B7)bm5pc~~dO%^I1}&%f=ALt08K%Zy=}T~9I-vzQ-WAk`H6MLAECS%NMa zFF!mIC!YERPLRmN&y$-6;N-Idake=O=ikxG5>pV%IR0E8hx?|-_FCT=mKn>e7nf%A zv@lk1IkT6&@i^0Svqs{_wZD*MW`U%3a$|p-dn?{5vGeaH;q>7Iyu4P2#6*5JlVO=% z*Xzu>6Pi1ozjT$%HqIP{Z%cpaAhXXm+=-_3@z}RM5idR&kK*|{nBDx4Im?V;nR(C? z077V%l=E`ell7*|Vq#+P?Cg>Frc53$6Ege0>=#%+b2Or(WBC<849o04`Ee#OHYQg0 zU+EZGZ@o1mhNQJ1D;R%V(jWg?{omO7pf{4^CiDBu7?v47o5?R{WSKE6Gk$G0zc!n1 zYL*$xjQ^ks|3MRmWyUgN7=~rWFbu;oV;F{EnK2B*GGm!B48t;G7=~e)F$}}7%ov7Y znX$|mhGChp%ov8b&SXXmB*qh2#7d%$c!PMK_?TfB<}!F+@kpKGl`O?G1KlOFn+Y!> zkT4L7h-zYw(ven%VVKL{4aFnXidPJZXS@{exLjs85q*iVL>w_ov1qko)Ljh2Fqc7{ z;*ph#SK<`U^i{m$a+%#o+)4~n^4V$1ffp&ASi>+3a~Z5uJTgo1$^^wTw<_Loxy*h> z+(Pstyp;pSDIsB&GHAyz40EYuDISSayyC5R<`%^}-FoT&0sd~S&aLcc)c^nh07*qo IM6N<$f|asd(f|Me literal 0 KcmV+b0RR6000031 diff --git a/docs/_template/description-generator/plugins/DocFX.Plugin.DescriptionGenerator.dll b/docs/_template/description-generator/plugins/DocFX.Plugin.DescriptionGenerator.dll new file mode 100644 index 0000000000000000000000000000000000000000..3e3a6fb7c829f3fb32d11d8184600bc557e6c7ad GIT binary patch literal 9216 zcmV+bB>&q@T95z(0000400030{{R5E000000000$0000000000000000000000000 z0000000000000000001h0000EAG!_zvMXX>K4yPg5XmZ)9aI4Gjt;000000000`MF0Ry0RsS8x76+c000000002s z03sj@0Wbgn8UO$Q2mk;80001XIRF3vAOHXWKmY&$000mGAOHXW0ssI60000000006 z0000000000fB*mh0ssI2000030APgx01yBG5C8xG01yBG5C8xG0000G0000000000 z0000aIRF4p00000KmY*L1ONa400000000000000000000U;qFN0002^Hvj-s00000 z00000000000000000000000000000000000000000000000000AOHXe0000000000 z00008AOHYJ00000000000000kbY*yS0001d82|tPAOHXW8UO$Q0ssI20000000000 z0000W003Yva&vNH0002g1ONa4KmY&$1^@s68~^|S00000000000000$002NPa%F69 zV*mgQ00000U;qFB0ssI2A^-pY00000000000000$002S&00000000000000000013 zIRF3v0000;0000200jUvBme-!6951K00000000000000000000000000000000000 z0000000000000000000000000000000000A11bO;Fa-dk0RR92000pv5C8xQC;8(!3KSF+ z6et$}015+d7ytkYeh2^n1SKsOCVmG100jO92><{Fa~S{t3MGID000Ci0ssIjZyNvr z3JW;&00007ZyW#s3Je>KA^-pZB^GiO003~JB^L;99RL6dq9qt|I{*N1q9qv!Zyo>u z3Zf+%azy|DaH1$5000UU6ciLFAOHXg2yY<(01AEy000CfEf*$!2LJ#B{ssyF00wg+ z000UlfC&Hq1SkUl04r}J000UND`^RDBme*k69fZqB>(^l2yYz#017B3000UT1q2cV zC?@~_3U4R?017B3000UT1_*B+000VdNdN$FC@BB{3M>l(5d{$j7AOM%00sze9smFe za$f)da40DN017M%0ucof1{Wv;000IFZz=!)3N4S`3JEL*32!R^01Dg(Zz=!)3OWJ* z|Nq_!2P_5$Zz})*3fyvm003|Tdj}3bq9`8#016Zo z6ci{R000VeEdT%t3I+skE&u=uelGw33JV1+2?ZA}a5$9!000JWFaQ7wauERlaBndH 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 z00004000020000000000000000000)0000109F8D0CE6E0BHbh0A&D40B!(g0B-;Q z0000a00aO408{{S0AT=b0CNCr0AT=h0BHbk0B!&P000000I&qu0{{R408;>T0CE6n z0B!(h07d|50Bitd07(FD0A>Jh0002A0{{R405AYB05AYB05AYF0Ac_z0002)0BZmN z07C$80Brzm0A&Df0CWIz0000%03ZNx0B-MXX>K4yPg5XmZ)9aI4Gjt;000000000`MF0Ry0RsR!`J0Xa000000002s z03sj@0WbgnBme*a2mk;80000ALjV8(AOHXWU;qFB000mGAOHXW0ssI60000000006 z0000000000pa1{>0ssI2000030APgx01yBG5C8xG01yBG5C8xG0000G0000000000 z0002ELI40y00000U;qHb1ONa400000000000000000000fB*mt0001_K>z?$00000 z00000000000000000000000000000000000000000000000000AOHXe0000000000 z00008AOHYJ00000000000000kbY*yS0000GBLDyZAOHXWBme*a0ssI20000000000 z0000W003Yva&vNH0002Q1ONa4U;qFB1^@s6CIA2c00000000000000$002NPa%F69 zV*mgQ00000fB*mh0ssI2EC2ui00000000000000$002S&0000000000000000002& zLI3~&0000;0000200jUnCIA3<8vp00(ay000UM2yYw!019s%000UNIF0}S010m%000UT z1Osm$000UIZy*2w3Me4}016WY1QG-&A^-piZzBKz3Me4}016WZ6cY#n5d{_~0{{R9 zC?o&?3KIzu2`D81016Wa0ucolC<6ch1``P0C~p)1016Zo6ci{X000VdZ2$mp6ciK` zC?)^^3IY)YC8CjbBnIynFT|K17*ECvT}C;$Ko+;Z&z0B{0(1ONa8j4l8G0VpW|016Zo6ci{H z000UDDgXchC;$Ke0MGy?_5dgv000330GR-wIROd)000020D%C{Pyq@60000JFa`i* z00002000pb3Ir?$1Q#v}D-Lp10RV6cD+Y3V0RV6cb1DD;3MF!Z0RV7sD*ylrC31-Y z0B{C!s{sIT11Ky2019s{000Ul7jG^A0171*Z!Z7<3MeoD01727111zIC@}y43U4w1 z017HH11K{9017BH000Uq0000JFa-c~0RR94000qkuK@sX1&kR0009F8C^Y~83KSF+ z6euPD019(9000UK1_W<6000UGZ#Vz|3UcQG0B~Z#w`03JeHxhXMd_1&kR000Af|000VaJOBU+26Ed10B~z>>0s?yk000CRSbYQl00b%%Fa!Xq00004000pK zZ#Vz|3UbW@0B~rP5=N3ata0jaB>g^0B{imCnp267e#0B{loC{h3b3K9ht<7-U<{iQ*?4^ZfA1<000175C8x`1^@sfRZ{?*761Sc0000Z zM^#Bg00022761Uu1ONadLTqnh0000000002000439|8yo4gdfE`T;Wl761SN0000t z00006000080000E0000E0000100013000030000F000050000D000010000800002 z00002000040000007C@<0000000scG12YE(05JqJ2L=Gp0w4zu08}1qJ|@1GfbR05t=*1qJ|81GfbR0MrAw1qJ}*0=ESQ0Eh*A z1qJ|S0(=Du0MG`l2Mz!T1oZ_502&B<1rh+50I>lI0DcIq2L=Fc0QCS00B;4Y2L=F% z0QCS006Ye*2L=Ek2z&(w00;(r1r`8G2mu8a0Du7j1qJ}M0y75&0D=H~1qJ}F2F(Zt z0DT6x1qJ|10QCR{0Q?BI1qJ}g2e$L0g46+0LcZd2L=HA1iJtR0Qm;v2L=G80el4p0DJ&^1tI`!1|SC_0QLtU2L=F^ z2D<500ble0001i0AmQP0t*1TBme*a z0EQS72L=EP0K_B!0001%0AdHT0t^7?B>(^b0Ff9O2f6|c0Q4mQ0001n7!wBu01W{A zB>(^b0D}NB0KNhZ01hSq0001y7#Rn;0uBHgCIA2c0EQS72L=ER03s#;0001k015!U z0S*8F0098s000010EY+w00IEK1^@s70I&oA00IC>0ssI30I&oA009871ONa60QLj` z00RK10uT@c04)Xp0096V0RR920FVd(0098m2mk;90NDrw06_o=022oR01*Ha2L=Ec z022oa04V?y2M_=;022og0672?2M_>3022og07(E72M_>J022og09gPN2M_>Z022og z0BHad2M_>>022ol0Oj_2g3kS z0R;!i03-lc2)+QJ0J{WL0I>ky1XTc80Wtz*04xAw1nU670L}ze0LcK50`LII02c!G z0677D0&4(a0mKOV0BHe;0tNsv0TT%S0C@ou2L=Fn0qg+~05Jg!2nhjs0saRN0C@qa z2oV8!0Z#-G0f7N{2o?c>0hS0K0g(Y^0aXB*0VV+@0m%R`2rL0H0TT#G0oec(2L=Gy z06GB>0NDVE0Z{?r0B-?S0XYE>0c!x+06Yj*0pS2)1rPw?09gTC0Wkp)31b1_0Br(0eJv<2c7}>022oW06YKz0IUH#0ImSG0XzT- z0KNf4022p-07(Jc2+jda00jrG08{{12)+OT0e=Jl0=WU>0aXAo0gVL?0x0PF%T03!hP0xke607C;V05bqm11c1v0A~Um z00jXw0dN6%0eS$Y0Ji|w0OJ6b0i^-O0q+6$0S5vs0zd);fB*mi009630000000000 z0N(}x00aO4000000000007nAo0000000ICf0000000000000232LJ#70096103QGV z0000008j!E1poj50096300RI30000008j$40RR910096500{s90000009gV71poj5 z00ICf00000000000000I1^@s600aO4000000000007n9G0ssI200aO40000000000 z07n9R1poj500jU800saA0000001N=d0000001*Ji03iTS05brg0F?mf0iOUH0ssI2 zJU%&JUoc-V06a%!bW&wzY-M9~Wn@rtZ*XODbZKRCK4M>AFkdhLJU%&JUou}X06b7~ zZ)0V1b3S5UUou}X06acpUtcg_F#t(LZgp*Ca$#a@WneJ?Nl$WQWpZU?MQ(L%WpZI+ zY-M0E07*q|b!}yGVRUbDU@-tmZgev;07i9gV_-4>OJ#XhVQh6}P+@6uU@`znZEbaQ zVPb4$L}_DmX>V>}a(Q4f06ac906a}^WOZz1J^)jBb97~GE=f-SQ~-8iY;|Q{UjR^Y zWpH6~Wld#tVPs)+VE}DqbYWy+bYTE(b7OCEY-wTuJU(LpQ+acAWo<4)Z)|L3V{~b6 zZgVb2Wo~71X=4CPZ)ZelVP|e{b98BA0BCe=Y(#Hk07qqXOks0$S8{1|WmIWxWmR-z z08DRTWB^2OV@7x`P;7N)X>Kk|VRLj%Z)9m^X=P*pL2z(oZe&AfX>4QwQe|OeRBuIY zWB^lTY-M9~Q)zBzY-LVwWMu$IbZu--Z)9ZvXJvF>L~mntZDnqBPH$vo07Y(fZDn#{ zVr*pqNknOLaBp*AVr*pqQ+acAWo<4)Z)|L3V{~b6ZgVb4ZEbaQVPb4$07qqXS8{1| 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 z0DA!dc0nL;Z*z1laB^>BWpi_Hav*SQb!TaAAZBlJAVhCtMpz(rG9YwlVRRs2WMp$7 zbZBKDY+-YBAY*TBZE18MWMOn=Aa7DW*~HEWgu{2XJsw`01N>D2Qe-&E;24K000UB00l8FF)lIy03HDV8BAew zbWLw$X=Z6V>lGA=VYE-)@IEFeR5Y;<*UWj$_X zb#!uJY%Cy9bz*F3V@qXuRBvl#Zar>wY-|7k000000001oE+w7-0ZmW>0001)0002^ zK>z^wBLDyZ00000000010000J0000d0001yLI41fBme*a00000000000000G00000 z00000000000000|Q$$mKOUuQ|EAC68pKOK(R~}jc0000(I$TwAWpZ;|Gc++YHe7RW zb#h~6TykY_Z*yEkZ(~MyE>LWBXK8LOOks0$O>bmrW@%+)TtshUMtCkzY;|X8ZZ1q= zb97B_WNBt;Wn^4$VrpDcWo%_(b7fp^Wpp$)F&08;=-08ao;0ABz}08Ri#08an_0002J1n>R;009620096100IC3 z0096100IC%0000000004000020000000000000000000)0000109F8D0CE6E0BHbh z0A&D40B!(g0B-;Q0000a00aO408{{S0AT=b0CNCr0AT=h0BHbk0B!&P000000I&qe z0{{R408;>T0CE6n0B!(h07d|50Bitd07(FD0A>Jh0001_0{{R405AYB05AYB05AYF z0Ac_z000060e1ia07C$80Brzm0A&Df0CWIz0000%03ZNx0B-In0CWIo0A&Cm0Am1e0B!(d0A&Dh0CWI#0AT=Z03ZNl0B-In0CWIo0A&Cm0B`_d z0A~PY04@Lk0000q015yB07C$80Brzp0AT=b0C@mT0AT=a0A&CG0000}0CWIp0Bitk z03ZNJ0CNC!0001702%-R07d|50Bitd07L*~0CNCi0CE6n0B`_w0BHbk0B!&P0000? z0AT=g0CWIN0B-