Browse Source

V3 Final merge (#1966)

* Update azure-pipelines.yml

* Update deploy.yml

* Remove version tag from proj

* Update deploy.yml

* Removed versions from project files

* Removed style of the nuget badge and added logo (#201)

The style was not properly added to it and the plastic version does not look good with the discord badge.
I thought it would look better with a logo

* Fix Type not being set in SocketApplicationCommand

* Remove useless GuildId property

* meta: update XML

* Add Autocomplete to SlashCommandOptionBuilder

* Added autocomplete in SlashCommandOptionBuilder. (#206)

Co-authored-by: Quin Lynch <49576606+quinchs@users.noreply.github.com>

* Fix duplicate autocomplete

* Fix #208

* Fix sub commands being interpreted as a parameter for autocomplete

* Fix exposed optional

* Support the discord:// protocol in buttons (#207)

* Update UrlValidation.cs

* Update ComponentBuilder.cs

* Add docs and better error messages.

* Fix wonky intentation

* Add competing activity status type (#205)

* Update GuildPermissionsTests.cs

* Update GuildPermissions.cs

* Add competing status type

* Add Icons to IRole (#204)

* Added icon field to IRole

* Added GetGuildRoleIconUrl()

* Added Clean Content Function (#174)

* Added Clean Content Function

* Fixed Spelling problems and bad var handling

* Add StripMarkDown Method

* Clean Content Expanded (#212)

* Implement CleanContent In IMessage & RestMessage

* Update Spelling and Documentation

* Add SanatizeMessage to MessageHelper and Refactor Rest and Socket Message

* Add event for autocomplete interaction (#214)

* Spelling corrections (#215)

* Remove null collections

* Followup with file async warnings (#216)

* Changed from NotNullOrWhitespace to NotNullOrEmpty

* Added NotNullOrEmpty on filename

* Added system to interpret from the path

* Added a check for if it contains a period

* It has been done, how ever it will break stuff

* Changed to use ??= how ever still added error check

* Added space under check

* Changed from with a period to valid file extension

* Added checks for SendFileAsync

* Removed filename != null &&

* Add channel types in application command options. (#217)

* add channel types in application command options

* Indent Docs

* Stage instance audit logs as well as thread audit log type

* Update azure-pipelines.yml

* Update azure-pipelines.yml

* Fix system messages not including mentioned users. Added ContextMenuCommand message type

* Remove file extension check (#218)

* Fix NRE in modify guild channel

* Fix 429's not being accounted for in ratelimit updates

* meta: add net5 framework

Co-Authored-By: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com>

* Proper doc logos (#221)

* Update GuildPermissionsTests.cs

* Update GuildPermissions.cs

* Add competing activity status type

* logo changes

* logo text as path

* add missing logo

* Update package logo and favicon

* Update docfx references

* Remove Console.WriteLine

* Rename Available to IsAvailable in stickers

* Rename Default and Required to IsDefault and IsRequired in IApplicationCommandOption. Rename DefaultPermission to IsDefaultPermission in IApplicationCommand

* Fix different rest channels not deserializing properly

* Refactor summaries and boolean property names

* General cleanup (#223)

* General cleanup

* Add Async suffix to SendAutocompleteResult

* Fix more formatting

* Fix unused RequestOptions in GetActiveThreadsAsync

* Add message to ArgumentNullException

* Ephemeral attachments

* Add missing jsonproperty attribute

* Add IMessage.Interaction

* Update attachment checks for embed urls

* meta: bump version

* Remove old package configs and update image

* Update package logos

* Fix logo reference for azure

* Deprecate old package definitions in favor for target file

* Deprecate old package definitions in favor for target file

Co-authored-by: Jared L <48422312+lhjt@users.noreply.github.com>

* Update package ids

* Fix url validation

* meta: bump version

* Fix assignment of UserMentions (#233)

* Fix CleanContent (#231)

* Fix SocketSlashCommandData access modifier. (#237)

Fixes #229

* Update README with better header (#232)

* Update README with better header

Adds HTML elements that implement the main logo & improve the redirection tag positions.

* Resolving border issue in light-mode

* Update sponsor section

* Implement checks for interaction respond times and multiple interaction responses. closes #236, #235

* Add response check to socket auto complete

* meta: bump versions

* Fix #239

* meta: bump version

* meta: update logo

* meta: bump versions

* Revert received at time, confirmed by discord staff to be accurate

* Update docs

* Update CHANGELOG.md

* meta: docs building

* Update docs.yml

* Update docs.yml

* Fix docfx version

* Update docs.yml

* Update docs.bat

* Rename docs repo for clone

* update docfx version

* Update docs.bat

* Update docfx version

* Remove docs from pipeline

* FAQ revamped, metadata updated (#241)

* FAQ revamped, metadata updated

* Update FAQ.md

* Update README.md

* Docs index improvement

* Fix InvalidOperationException in modify channel

* feature: guild avatars, closes #238

* feature: modify role icons

* meta: changelog

* meta: bump version

* Update README.md

* Fix non value type options not being included in autocomplete

* Add new activity flags (#254)

* Add new activity flags

* Add missing commas

* Added support for GUILD_JOIN_REQUEST_DELETE event (#253)

Fixes #247

* Adding BotHTTPInteraction user flag (#252)

* animated guild banner support (#255)

* Docs work (WIP) (#242)

* Main page work

* Metadata logo dir

* More main page edits

* Naming change

* Dnet guide entries pruned

* Add student hub guild directory channel (#256)

* animated guild banner support

* Add guild directory channel

* Fix followup with file overwrite having incorrect parameter locations

* Update GUILD_JOIN_REQUEST_DELETE event

* Update head.tmpl.partial

* Removed BannerId and AccentColor  (#260)

* Removed BannerId property, GetBannerURL method, and AccentColor property from IUser and socket entities.

* Fixed errors in IUser.cs

* Added back summary for GetAvatarUrl method in IUser.cs

* Support Guild Boost Progress Bars (#262)

* Support Guild Boost Progress Bars

* Update SocketChannel.cs

* Fix non-optional and unnecessary values.

* Spelling

* Reordering and consistency.

* Remove log for reconnect

* Add missing flags to SystemChannelMessageDeny (#267)

* Rename new activity flags

* Guild feature revamp and smart gateway intent checks

* Get thread user implementation

* Amend creating slash command guide (#269)

* Adding BotHTTPInteraction user flag

* Added comments explaining the Global command create stipulations.

* Fix numeric type check for options

* Add state checking to ConnectionManager.StartAsync (#272)

* initial interface changes

* Multi file upload + attachment editing

* meta: bump versions

* Update CHANGELOG.md

* Update CHANGELOG.md

* Support Min and Max values on ApplicationCommandOptions (#273)

* Support Min and Max values on ApplicationCommandOptions

* Support decimal min/max values

* Docs imrpovments + use ToNullable

* Logomark, doc settings edit (#258)

* Logomark, doc settings edit

* Replace standard logo

* Bumping docfx plugins to latest release

* Bump version metadata

* Logo svg fix

* Change default sticker behavior and add AlwaysResolveSticker to the config

* Implement rest based interactions. Added ED25519 checks. Updated summaries.

* Update package logo

* Automatically fix ordering of optional command options (#276)

* auto fix optional command option order

* clean up indentation

* Fix maximum number of Select Menu Options (#282)

As of https://discord.com/developers/docs/interactions/message-components#select-menu-object-select-menu-structure the maximum number of options is 25, not less than 25. Hopefully the change catches all necessary locations

* Add voice region to modify voice channels

* Update summaries on rest interactions

* Interaction Specific Interfaces (#283)

* added interaction specific interfaces

* fix build error

* implement change requests

* Update application

* Add Guild Scheduled Events (#279)

* guild events initial

* sharded events

* Add new gateway intents and fix bugs

* More work on new changes to guild events

* Update guild scheduled events

* Added events to extended guild and add event start event

* Update preconditions

* Implement breaking changes guild guild events. Add guild event permissions

* Update tests and change privacy level requirements

* Update summaries and add docs for guild events

* meta: bump version

* Increment meta version (#285)

* Increment meta version

* Update docfx.json

* Fix #289 and add configureawaits to rest based interactions

* meta: bump version

* Add GUILD_SCHEDULED_EVENT_USER_ADD and GUILD_SCHEDULED_EVENT_USER_REMOVE (#287)

* Remove newline

* Fix autocomplete result value

* meta: bump versions

* Add `GuildScheduledEventUserAdd` and `GuildScheduledEventUserRemove` to sharded client

* Make RestUserCommand public (#292)

* Fix Components not showing on FUWF (#288) (#293)

Adds Components to Payload JSON Generation

* Implement smarter rest resolvable interaction data. Fixes #294

* Add UseInteractionSnowflakeDate to config #286

* Implement Better Discord Errors (#291)

* Initial error parsing

* Implement better errors

* Add missing error codes

* Add voice disconnect opcodes

* Remove unused class, add summaries to discordjsonerror, and remove public constructor of slash command properties

* Add error code summary

* Update error message summary

* Update src/Discord.Net.Core/DiscordJsonError.cs

Co-authored-by: Jared L <48422312+lhjt@users.noreply.github.com>

* Update src/Discord.Net.WebSocket/API/Voice/VoiceCloseCode.cs

Co-authored-by: Jared L <48422312+lhjt@users.noreply.github.com>

* Fix autocomplete result value

Co-authored-by: Jared L <48422312+lhjt@users.noreply.github.com>

* Change the minimum length of slash commands to 1 (#284)

* Change the minimum length of slash commands to 1. This is the correct value according to the docs and it has been changed after user feedback.

* Fix the limit in 3 other places

Co-authored-by: quin lynch <lynchquin@gmail.com>

* Add new thread creation properties

* Add role emoji. Fixes #295

* Fix mocked text channel

* Fix precondition checks. Closes #281

* Initial fix (#297)

* meta: bump version

* Update property names and summaries

* Add Audit Log Data classes for Threads (#301)

* Add ThreadDeleteAuditLogData

* Add ThreadCreateAuditLogData

* Fix ThreadCreateAuditLogData using old instead of new value

* Create ThreadInfo Class

* Fix Thread not being a property

* Add ThreadUpdateAuditLogData

* Cleanup usings

* Add RateLimit to ThreadAuditLogData classese

Co-authored-by: Playwo <eliaswolf2001@t-online.de>

* Fix #300

* Interaction Command Service (#52)

* init

* attribute rename

* added docs

* Revert "added docs"

This reverts commit 30aa0c4ef7.

* added basic docs

* Switched to nested modules  for method grouping, changed command traversal method

* interface now declares the helper methods

* added new method with predicate parameter

* added config option for deleting the "thinking" state of unhandled commands

* Slash Module Base now exposes helper methods for interacting with the underlying Interaction

* Revert "interface now declares the helper methods"

This reverts commit 541b0be935.

* IDiscordInteraction now declares the helper methods

* new cancelable wait interaction method

* added support for user created command types

* added option type 'number', added write method to typereaders

* added enum and timespan typereaders

* revert

* added interface method declarations

* inline docs

* revert interface changes

* current user id assignment in sharded client

* added wildcards to interactions, tweaks

* tweaks on interaction wild card pattern

* Pre-app menu

* fixed CurrentUserId and added application command events

* made event listener persistent

* Sharded Client Application Command Events and CurrentUserId Issue (#105)

* added interface method declarations

* inline docs

* current user id assignment in sharded client

* fixed CurrentUserId and added application command events

* made event listener persistent

* removed option type converter, task offloaded to typereaders

* added "deleteOGResponse" method to module base

* Upstream fetch for Discord-Net-Labs/release/3.x

* solved merge conflicts

* removed merge artifacts

* added new Context Command attributes

* added Conxtext Command info classes and changed the naming scheme for the existing classes

* added IgnoreGroupNames prop to command attributes

* added ContextCommand builder

* moved command builders to internal

* added ContextCommand methods to the command service

* command service now uses InteractionHelper to register commands

* bug fixes and refactorings

* docs update

* added inline docs to public members

* added inline docs

* added method name property to command infos

* added inline docs

* changed the execution callback to a declared delegate

* createInstance delegate is now created only once per module

* declared the ExecuteCallback delegate

* introduced a way to modify the command permissions

* changed method names

* added optional compiled lambda module builder

* added the missing sync execution option

* moved run mode selection to the base class

* info class refactorings

* switched to compiled lambda based method invoke

* command refactorings

* added docs

* removed untended class

* bug fixes

* minor refactorings

* reflection changes

* bug fix for interaction parameters

* commands and modules now groups the preconditons on building

* added default permission to context commands

* added DontAutoRegister attribute

* renamed TypeReader to TypeConverter

* added docs to TypeConverterResult, made ISlashModuleBase public

* namespace and project change

* added inline docs file

* renamed ExecuteComponentCommand method

* added scoped service support to the dependency injection model

* fixed premature disposal of scoped services

* extended the scope to cover the precondition checking methods

* removed slash command related preconditions from core lib

* added sample application

* precondition checks are now executed according to the command RunMode

* reverting the conflicting changes

* reverted SocketInteraction

* reverting more conflicts

* added indentations to inline docs

* implemented change requests

* updated the sample app

* moved builders to public

* added indentations to typeconverter docs

* renamed old componentCommandExecuted event

* bug fix for generic typeconverters

* Revert "bug fix for generic typeconverters"

This reverts commit fcc61957de.

* bug fix for context commands

* code cleanup

* removed public module build method

* modev OnModuleBuilding execution inside the module build method

* added try-catch blocks encapsulating arg generation

* fixed parameter preconditions not raising commandExecuted event

* removed OnModuleBuilding execution from ModuleClassBuilder

* removed setters from Precondition ErrorMessages

* added methods to interaction service for creating user defined modules

* added IParameterInfo parameter to TypeConverter.Write

* changed the target frameworks

* DefaultValueConverter bug fix

* GenerateArgs refactorings

* WaitForMessageComponent now relies message id

* added ChannelTypes support

* added ChannelTypes support

* fix build error for new lib version

* added ToString method to CommandInfo

* added ToString method to CommandInfo

* Fix index out of bounds error for new non-null slash command option collection

* enum converter rework

* added user extendable types to command context and module base

* added regex anchors to ensure pattern matches the whole string

* incomplete guides

* add missing ignoreGroupNames assignment for ComponentInteraction

* typeconverters now seperate pascal casing parameter names

* fix missing IServiceScopefactory ?

* Revert "typeconverters now seperate pascal casing parameter names"

This reverts commit 141300f3d2.

* moved the option name pascal casing seperator to RestUtils

* fix component command arg generation

* removed , from default command delimiters

* updated the regex to match every non whitespace value

* added Autocomplete interaction support and updated the regex to match every non whitespace value

* replaced the posix class with range exps in pascal casing seperator

* added inline docs to autocompleter related classes

* added regex metacharacter escape to wildcard patterns

* added null check to Regex EscapeExcluding

* added .net5.0 support and updated the project package

* added .net5.0 support and updated the project package

* add dependency injection to autocompleters

* add net6.0

* bump versions

* bug fix: pascal casing parameters are not assigned

* rework autocomplete commands to accept command and parameter names seperatly

* rename *InteractionCommandContext to *InteractionContext

* add max-min value support to number type slash command options

* add hide attribute to deafult enum converter

* add inline docs

* guides update: min/max value and autocomplete interactions

* remove net6.0 support

* add inline doc to Config.EnableAutocompleters

* add autocompleters guide

* added attribute usage to min/max value

* implement rest based interactions

* add handling logic for rest based interactions

* update default TypeConverters to accommodate rest based interactions

* added interaction specific interfaces

* fix build error

* implement change requests

* bump metapackage version

* replace concrete interface types with interfaces in command execution logic

* fix min/max value attribute target

* add rest specific interaction module for creating interaction responses for rest based interactions within the module

* update rest callback to accept an interaction context parameter

* clean up RestResponseCallback implementation artifacts

* fix command registration bug when using the sharded socket client

* update docs

* fix build errors

* fix slash command depth check

* implement requested changes

* fix build error

* the grand finale

* the grand finale

Co-authored-by: quin lynch <lynchquin@gmail.com>

* Remove XML doc

* Add Interactions service to azure build

* Add DocFX refs to interaction framework docs

* meta: bump docfx version

* meta: bump versions

* Remove versioning metadata in csproj

* Fix user command mismatch in docs

* Fix parameter in message commands

* Fix SocketVoiceChannel options are created as generic mentionables in Interaction service (#308)

* added interaction specific interfaces

* fix build error

* implement change requests

* add autocomplete respond method to IAutocompleteInteraction

* fix sharded client current user

* fix generic typeconverter picking priority

* Revert "fix sharded client current user"

This reverts commit a9c15ffd6a.

* Revert "add autocomplete respond method to IAutocompleteInteraction"

This reverts commit f2fc50f1f1.

* meta: bump version

* Improve the `GuildFeatures` converter (#311)

* Fix Message/User commands are not being executed when their name have spaces on it  (#310)

* added interaction specific interfaces

* fix build error

* implement change requests

* add autocomplete respond method to IAutocompleteInteraction

* fix sharded client current user

* fix generic typeconverter picking priority

* Revert "fix sharded client current user"

This reverts commit a9c15ffd6a.

* Revert "add autocomplete respond method to IAutocompleteInteraction"

This reverts commit f2fc50f1f1.

* fix command parsing for names with spaces

* meta: bump version

* fix minor spelling mistake

* add missing $ on docs

Co-Authored-By: Liege72 <65319395+Liege72@users.noreply.github.com>

* Squashed commit of the following:

commit ff0bbbd4d3
Merge: 41b4686b 19a66bf8
Author: quin lynch <lynchquin@gmail.com>
Date:   Sat Nov 27 08:39:35 2021 -0400

    Merge branch 'dev' of https://github.com/discord-net/Discord.Net into dev

commit 19a66bf878
Author: Daniel Baynton <49287178+230Daniel@users.noreply.github.com>
Date:   Fri Nov 26 15:41:55 2021 +0000

    feature: Add method to clear guild user cache (#1767)

    * Add method to clear a SocketGuild's user cache

    * Add optional predicate

    * Compress overload to be consistant

    * Fix global user not clearing (may cause other issues)

    * Remove debug code and add param documentation

    * Standardise doc string

    * Remove old hack-fix

    * Rename new method for consistency

    * Add missing line to reset downloaderPromise

    * Undo accidental whitespace changes

    * Rider better actually keep the tab this time

    Co-authored-by: Quin Lynch <49576606+quinchs@users.noreply.github.com>

commit b9274d115d
Author: Monica S <FiniteReality@users.noreply.github.com>
Date:   Fri Nov 26 15:41:08 2021 +0000

    Add characters commonly use in links to Sanitize (#1152)

    Co-authored-by: Quin Lynch <49576606+quinchs@users.noreply.github.com>

commit 51e06e9ce1
Author: Quin Lynch <49576606+quinchs@users.noreply.github.com>
Date:   Fri Nov 26 11:30:19 2021 -0400

    feature: warn on invalid gateway intents (#1948)

commit 82276e351a
Author: Quin Lynch <49576606+quinchs@users.noreply.github.com>
Date:   Fri Nov 26 11:29:53 2021 -0400

    feature: default application games (#1949)

    * Initial implementation

    * Add missing summary

commit 4f1fe2b084
Merge: 9d6dc627 3cd9f399
Author: quin lynch <lynchquin@gmail.com>
Date:   Fri Nov 26 11:23:32 2021 -0400

    Merge branch 'siscodeorg-commands/validate-get-best-match' into dev

commit 3cd9f39918
Merge: 9d6dc627 adf3a9c4
Author: quin lynch <lynchquin@gmail.com>
Date:   Fri Nov 26 11:23:05 2021 -0400

    Merge branch 'commands/validate-get-best-match' of https://github.com/siscodeorg/Discord.Net into siscodeorg-commands/validate-get-best-match

commit adf3a9c459
Author: roridev <t3ctotalmenterandom1@outlook.com>
Date:   Fri Nov 26 09:26:53 2021 -0300

    Fix incorrect casing on `HandleCommandPipeline`

commit a92ec56d88
Author: roridev <t3ctotalmenterandom1@outlook.com>
Date:   Thu Nov 25 16:42:18 2021 -0300

    Add requested changes

    Changes:
    - Use IResult instead of Optional CommandMatch

    - Rework branching workflow

commit d1b31c8f52
Author: roridev <t3ctotalmenterandom1@outlook.com>
Date:   Thu Nov 25 15:31:48 2021 -0300

    Add `MatchResult`

commit 9d6dc6279d
Author: Quin Lynch <49576606+quinchs@users.noreply.github.com>
Date:   Thu Nov 25 11:25:19 2021 -0400

    Update socket presence and add new presence event (#1945)

commit 10afd96e6e
Author: Quin Lynch <49576606+quinchs@users.noreply.github.com>
Date:   Thu Nov 25 11:24:44 2021 -0400

    feature: Handle bidirectional usernames (#1943)

    * Initial implementation

    * Update summary

commit 143ca6db43
Author: Quin Lynch <49576606+quinchs@users.noreply.github.com>
Date:   Thu Nov 25 11:23:33 2021 -0400

    fix NRE when adding parameters thru builders (#1946)

commit d5f5ae132c
Author: Cenk Ergen <57065323+Cenngo@users.noreply.github.com>
Date:   Thu Nov 25 18:22:50 2021 +0300

    fix sharded client current user (#1947)

commit b5c150dc16
Author: Quin Lynch <49576606+quinchs@users.noreply.github.com>
Date:   Wed Nov 24 12:53:39 2021 -0400

    Add Voice binaries (#1944)

    * Add binaries and read me

    * Update sending voice docs

    * Undo markdown formatting

commit bc440abd44
Author: Quin Lynch <49576606+quinchs@users.noreply.github.com>
Date:   Wed Nov 24 12:52:55 2021 -0400

    Implement multi-file upload to webhooks (#1942)

commit f7a07aec02
Author: Paulo <pnmanjos@hotmail.com>
Date:   Wed Nov 24 09:57:06 2021 -0300

    Add default nullable enum typereader (#1518)

commit 6abdfcbf87
Author: Slate <kristian.f@hotmail.co.uk>
Date:   Wed Nov 24 12:55:07 2021 +0000

    Added negative TimeSpan handling (#1666)

    - Added unit tests for the TimeSpanTypeReader
    - Fixes https://github.com/discord-net/Discord.Net/issues/1657

commit e0dbe7c695
Author: Paulo <pnmanjos@hotmail.com>
Date:   Wed Nov 24 09:43:57 2021 -0300

    Add MaxBitrate to the interface (#1861)

    Co-authored-by: Quin Lynch <49576606+quinchs@users.noreply.github.com>

commit 3cb662ff7a
Author: d4n <dan3436@hotmail.com>
Date:   Tue Nov 23 10:49:31 2021 -0500

    Add null check to AllowedMentions.ToModel() (#1865)

commit 900c1f4385
Author: Quin Lynch <49576606+quinchs@users.noreply.github.com>
Date:   Tue Nov 23 11:46:18 2021 -0400

    Fix emoto try parse (#1941)

commit 933ea42eaa
Author: Quin Lynch <49576606+quinchs@users.noreply.github.com>
Date:   Tue Nov 23 09:58:05 2021 -0400

    Merge Labs 3.X into dev (#1923)

    * meta: bump version

    * Null or empty fix (#176)

    * Add components and stickers to ReplyAsync extension

    * Fixed null or empty

    * Changed Label to Description

    * -||-

    Co-authored-by: quin lynch <lynchquin@gmail.com>

    * More regions (#177)

    * Preconditions

    * ChannelHelper

    * RestDMChannel

    * RestGroupChannel

    * RestBan

    * RestGroupUser

    * EntityExtensions

    * DiscordSocketClient

    * DiscordSocketClient

    * Discord.net.core.xml fix (#178)

    * Changed Label to Description

    * Added Discord- .MessageComponent .ISticker[]

    ,Discord.MessageComponent,Discord.ISticker[] to ReplyAsync

    * Remove references to labs

    * Update Discord.Net.sln

    * Added SendMessagesInThreads and StartEmbeddedActivities. (#175)

    * Added SendMessagesInThreads and StartEmbeddedActivities.

    Adjusted owner perms.
    Change UsePublicThreads -> CreatePublicThreads
    Change UsePrivateThreads -> CreatePrivateThreads

    * removed extra ///

    * Added UsePublicThreads and UsePrivateThreads back with Obsolete Attribute

    * removed 'false' from Obsolete Attribute

    * Squashed commit of the following:

    commit dca41a348e
    Author: quin lynch <lynchquin@gmail.com>
    Date:   Thu Sep 23 07:02:19 2021 -0300

        Autocomplete commands

    * meta: xml. closes #171

    * Revert user agent and $device to dnet

    * meta: bump version

    * meta: bump vers

    * Fix sticker args

    * Grammer fix (#179)

    * Made IVoiceChannel mentionable

    * Embeds array for send message async (#181)

    * meta: bump version

    * meta: bump vers

    * Fix sticker args

    * Grammer fix (#179)

    * Added embeds for SendMessageAsync

    * [JsonProperty("embed")] forgot to remove this

     public Optional<Embed> Embed { get; set; }

    * It has been done as requested.

    * Changed the old way of handeling single embeds

    * Moved embeds param and added options param

    * xmls

    Co-authored-by: quin lynch <lynchquin@gmail.com>

    * Fix thread permissions (#183)

    * Update GuildPermissionsTests.cs

    * Update GuildPermissions.cs

    * Use compound assignment (#186)

    * Used compound assignment

    * -||-

    * -||-

    * Remove unnecessary suppression (#188)

    * Inlined variable declarations (#185)

    * Fixed some warnings (#184)

    * Fixed some warnings

    * Another fixed warning

    * Changed the SSendFileAsync to SendFileAsync

    * Removed para AlwaysAcknowledgeInteractions

    * Moved it back to the previous version

    * Added periods to the end like quin requested!! :((

    Co-authored-by: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com>

    * Object initialization can be simplified fixed (#189)

    * Conditional-expression-simplification (#193)

    * Capitlazation fixes (#192)

    * Removed-this. (#191)

    * Use 'switch' expression (#187)

    * Use 'switch' expression

    * Reverted it to the old switch case

    * Fixed-compiler-error (#194)

    * Submitting updates to include new permissions. (#195)

    * Submitting updates to include new permissions.

    * Make old permissions obsolete and update tests

    Co-authored-by: quin lynch <lynchquin@gmail.com>

    * Update azure-pipelines.yml

    * Update azure-pipelines.yml

    * Update azure-pipelines.yml

    * Add support for long in autocomplete option

    * Add support for sending files with multiple embeds (#196)

    * Add support for sending files with multiple embeds

    * Simplify prepending single embed to embed array

    * Consistency for embeds endpoints (#197)

    * Changed the way of handling prepending of embeds.

    For consistency.

    * reformatted the summary

    * Revert pipeline

    * Fix duplicate merge conflicts

    * Changed minimum slash command name length to 1 per Discord API docs (#198)

    * Channel endpoints requirements correction (#199)

    * Added some requirements to channels for topic

    * Changed check from NotNullOrEmpty to NotNullOrEmpty

    * Added some requirements to channels for name

    Preconditions.LessThan

    * Formatting of file

    * Added restriction for description not being null (#200)

    * Update azure-pipelines.yml

    * Update deploy.yml

    * Remove version tag from proj

    * Update deploy.yml

    * Removed versions from project files

    * Removed style of the nuget badge and added logo (#201)

    The style was not properly added to it and the plastic version does not look good with the discord badge.
    I thought it would look better with a logo

    * Fix Type not being set in SocketApplicationCommand

    * Remove useless GuildId property

    * meta: update XML

    * Add Autocomplete to SlashCommandOptionBuilder

    * Added autocomplete in SlashCommandOptionBuilder. (#206)

    Co-authored-by: Quin Lynch <49576606+quinchs@users.noreply.github.com>

    * Fix duplicate autocomplete

    * Fix #208

    * Fix sub commands being interpreted as a parameter for autocomplete

    * Fix exposed optional

    * Support the discord:// protocol in buttons (#207)

    * Update UrlValidation.cs

    * Update ComponentBuilder.cs

    * Add docs and better error messages.

    * Fix wonky intentation

    * Add competing activity status type (#205)

    * Update GuildPermissionsTests.cs

    * Update GuildPermissions.cs

    * Add competing status type

    * Add Icons to IRole (#204)

    * Added icon field to IRole

    * Added GetGuildRoleIconUrl()

    * Added Clean Content Function (#174)

    * Added Clean Content Function

    * Fixed Spelling problems and bad var handling

    * Add StripMarkDown Method

    * Clean Content Expanded (#212)

    * Implement CleanContent In IMessage & RestMessage

    * Update Spelling and Documentation

    * Add SanatizeMessage to MessageHelper and Refactor Rest and Socket Message

    * Add event for autocomplete interaction (#214)

    * Spelling corrections (#215)

    * Remove null collections

    * Followup with file async warnings (#216)

    * Changed from NotNullOrWhitespace to NotNullOrEmpty

    * Added NotNullOrEmpty on filename

    * Added system to interpret from the path

    * Added a check for if it contains a period

    * It has been done, how ever it will break stuff

    * Changed to use ??= how ever still added error check

    * Added space under check

    * Changed from with a period to valid file extension

    * Added checks for SendFileAsync

    * Removed filename != null &&

    * Add channel types in application command options. (#217)

    * add channel types in application command options

    * Indent Docs

    * Stage instance audit logs as well as thread audit log type

    * Update azure-pipelines.yml

    * Update azure-pipelines.yml

    * Fix system messages not including mentioned users. Added ContextMenuCommand message type

    * Remove file extension check (#218)

    * Fix NRE in modify guild channel

    * Fix 429's not being accounted for in ratelimit updates

    * meta: add net5 framework

    Co-Authored-By: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com>

    * Proper doc logos (#221)

    * Update GuildPermissionsTests.cs

    * Update GuildPermissions.cs

    * Add competing activity status type

    * logo changes

    * logo text as path

    * add missing logo

    * Update package logo and favicon

    * Update docfx references

    * Remove XML files and use original pipeline format

    * Remove console writeline

    * Remove Console.WriteLine

    * Remove useless log

    * Rename Available sticker field to IsAvailable

    * Rename Available to IsAvailable in stickers

    * Add summary indent for role members

    * Add summary indent to SocketInvite

    * Rename DefaultPermission to IsDefaultPermission

    * Rename Default to IsDefault and Required to IsRequired in IApplicationCommandOption

    * Rename Default and Required to IsDefault and IsRequired in IApplicationCommandOption. Rename DefaultPermission to IsDefaultPermission in IApplicationCommand

    * Remove extra white spaces

    * Renamed Joined, Archived, and Locked to HasJoined, IsArchived, and IsLocked

    * Rename Live and DiscoverableDisabled to IsDiscoverableDisabled and IsLive in IStageChannel

    * Remove newline

    * Add indent to summaries

    * Remove unnecessary json serializer field

    * Fix ToEntity for roletags incorrectly using IsPremiumSubscriber

    * Update RestChannel for new channel types

    * Fix different rest channels not deserializing properly

    * fully qualify internal for UrlValidation and add indent to summary

    * Add missing periods to InteractionResponseType

    * Fix summary in IApplicationCommandOptionChoice

    * Update IApplicationCommandOption summaries

    * Update IApplicationCommandInteractionDataOption summaries

    * Update IApplicationCommandInteractionData summaries

    * Update IApplicationCommand summaries

    * Update ApplicationCommandType summaries

    * rename DefaultPermission to IsDefaultPermission in ApplicationCommandProperties

    * update ApplicationCommandOptionChoiceProperties summaries

    * Rename Default, Required, and Autocomplete to IsDefault, IsRequired, and IsAutocomplete in ApplicationCommandOptionProperties

    * Update SlashCommandProperties summaries

    * update SlashCommandBuilder boolean field names, summaries, and choice parameters

    * Update SelectMenuOption summaries, Rename Default to IsDefault in SelectMenuOption

    * update SelectMenuComponent summaries. Rename Disabled to IsDisabled in SelectMenuComponent

    * update ComponentBuilder summaries and boolean fields.

    * Update ButtonComponent summaries and boolean fields

    * update ActionRowComponent summaries

    * Update UserCommandBuilder

    * Update MessageCommandBuilder summaries and boolean properties

    * Update IGuild summary

    * Update IGuild summaries

    * Update StagePrivacyLevel summary

    * update IThreadChannel summaries

    * Update IStageChannel summaries

    * Refactor summaries and boolean property names

    * General cleanup (#223)

    * General cleanup

    * Add Async suffix to SendAutocompleteResult

    * Fix more formatting

    * Fix unused RequestOptions in GetActiveThreadsAsync

    * Add message to ArgumentNullException

    * Ephemeral attachments

    * Add missing jsonproperty attribute

    * Add IMessage.Interaction

    * Update attachment checks for embed urls

    * meta: bump version

    * Remove old package configs and update image

    * Update package logos

    * Fix logo reference for azure

    * Deprecate old package definitions in favor for target file

    * Deprecate old package definitions in favor for target file

    Co-authored-by: Jared L <48422312+lhjt@users.noreply.github.com>

    * Update package ids

    * Fix url validation

    * meta: bump version

    * Fix assignment of UserMentions (#233)

    * Fix CleanContent (#231)

    * Fix SocketSlashCommandData access modifier. (#237)

    Fixes #229

    * Update README with better header (#232)

    * Update README with better header

    Adds HTML elements that implement the main logo & improve the redirection tag positions.

    * Resolving border issue in light-mode

    * Update sponsor section

    * Implement checks for interaction respond times and multiple interaction responses. closes #236, #235

    * Add response check to socket auto complete

    * meta: bump versions

    * Fix #239

    * meta: bump version

    * meta: update logo

    * meta: bump versions

    * Revert received at time, confirmed by discord staff to be accurate

    * Merge branch 'release/3.x' of https://github.com/Discord-Net-Labs/Discord.Net-Labs into merger-labs

    Update requested changes of obsolete and references to labs.

    Added `Interaction` to `IMessage`
    Fixed grammar
    Fixed bugs relating to interactions.

    * Update docs

    * Update CHANGELOG.md

    * meta: docs building

    * Update docs.yml

    * Update docs.yml

    * Fix docfx version

    * Update docs.yml

    * Update docs.bat

    * Rename docs repo for clone

    * update docfx version

    * Update docs.bat

    * Update docfx version

    * Remove docs from pipeline

    * FAQ revamped, metadata updated (#241)

    * FAQ revamped, metadata updated

    * Update FAQ.md

    * Update README.md

    * Docs index improvement

    * Fix InvalidOperationException in modify channel

    * feature: guild avatars, closes #238

    * feature: modify role icons

    * meta: changelog

    * meta: bump version

    * Update README.md

    * Fix non value type options not being included in autocomplete

    * Add new activity flags (#254)

    * Add new activity flags

    * Add missing commas

    * Added support for GUILD_JOIN_REQUEST_DELETE event (#253)

    Fixes #247

    * Adding BotHTTPInteraction user flag (#252)

    * animated guild banner support (#255)

    * Docs work (WIP) (#242)

    * Main page work

    * Metadata logo dir

    * More main page edits

    * Naming change

    * Dnet guide entries pruned

    * Add student hub guild directory channel (#256)

    * animated guild banner support

    * Add guild directory channel

    * Fix followup with file overwrite having incorrect parameter locations

    * Merge labs 3.x

    * Update GUILD_JOIN_REQUEST_DELETE event

    * Update head.tmpl.partial

    * Removed BannerId and AccentColor  (#260)

    * Removed BannerId property, GetBannerURL method, and AccentColor property from IUser and socket entities.

    * Fixed errors in IUser.cs

    * Added back summary for GetAvatarUrl method in IUser.cs

    * Support Guild Boost Progress Bars (#262)

    * Support Guild Boost Progress Bars

    * Update SocketChannel.cs

    * Fix non-optional and unnecessary values.

    * Spelling

    * Reordering and consistency.

    * Remove log for reconnect

    * Add missing flags to SystemChannelMessageDeny (#267)

    * Fix labs reference in analyzer project and provider project

    * Rename new activity flags

    * Guild feature revamp and smart gateway intent checks

    * Get thread user implementation

    * Amend creating slash command guide (#269)

    * Adding BotHTTPInteraction user flag

    * Added comments explaining the Global command create stipulations.

    * Fix numeric type check for options

    * Add state checking to ConnectionManager.StartAsync (#272)

    * initial interface changes

    * Multi file upload + attachment editing

    * meta: bump versions

    * Update CHANGELOG.md

    * Update CHANGELOG.md

    * Support Min and Max values on ApplicationCommandOptions (#273)

    * Support Min and Max values on ApplicationCommandOptions

    * Support decimal min/max values

    * Docs imrpovments + use ToNullable

    * Logomark, doc settings edit (#258)

    * Logomark, doc settings edit

    * Replace standard logo

    * Bumping docfx plugins to latest release

    * Bump version metadata

    * Logo svg fix

    * Change default sticker behavior and add AlwaysResolveSticker to the config

    * Implement rest based interactions. Added ED25519 checks. Updated summaries.

    * Update package logo

    * Automatically fix ordering of optional command options (#276)

    * auto fix optional command option order

    * clean up indentation

    * Fix maximum number of Select Menu Options (#282)

    As of https://discord.com/developers/docs/interactions/message-components#select-menu-object-select-menu-structure the maximum number of options is 25, not less than 25. Hopefully the change catches all necessary locations

    * Add voice region to modify voice channels

    * Update summaries on rest interactions

    * Interaction Specific Interfaces (#283)

    * added interaction specific interfaces

    * fix build error

    * implement change requests

    * Update application

    * Add Guild Scheduled Events (#279)

    * guild events initial

    * sharded events

    * Add new gateway intents and fix bugs

    * More work on new changes to guild events

    * Update guild scheduled events

    * Added events to extended guild and add event start event

    * Update preconditions

    * Implement breaking changes guild guild events. Add guild event permissions

    * Update tests and change privacy level requirements

    * Update summaries and add docs for guild events

    * meta: bump version

    * Increment meta version (#285)

    * Increment meta version

    * Update docfx.json

    * Fix #289 and add configureawaits to rest based interactions

    * meta: bump version

    * Add GUILD_SCHEDULED_EVENT_USER_ADD and GUILD_SCHEDULED_EVENT_USER_REMOVE (#287)

    * Remove newline

    * Fix autocomplete result value

    * meta: bump versions

    * Add `GuildScheduledEventUserAdd` and `GuildScheduledEventUserRemove` to sharded client

    * Make RestUserCommand public (#292)

    * Fix Components not showing on FUWF (#288) (#293)

    Adds Components to Payload JSON Generation

    * Implement smarter rest resolvable interaction data. Fixes #294

    * Add UseInteractionSnowflakeDate to config #286

    * Implement Better Discord Errors (#291)

    * Initial error parsing

    * Implement better errors

    * Add missing error codes

    * Add voice disconnect opcodes

    * Remove unused class, add summaries to discordjsonerror, and remove public constructor of slash command properties

    * Add error code summary

    * Update error message summary

    * Update src/Discord.Net.Core/DiscordJsonError.cs

    Co-authored-by: Jared L <48422312+lhjt@users.noreply.github.com>

    * Update src/Discord.Net.WebSocket/API/Voice/VoiceCloseCode.cs

    Co-authored-by: Jared L <48422312+lhjt@users.noreply.github.com>

    * Fix autocomplete result value

    Co-authored-by: Jared L <48422312+lhjt@users.noreply.github.com>

    * Change the minimum length of slash commands to 1 (#284)

    * Change the minimum length of slash commands to 1. This is the correct value according to the docs and it has been changed after user feedback.

    * Fix the limit in 3 other places

    Co-authored-by: quin lynch <lynchquin@gmail.com>

    * Add new thread creation properties

    * Add role emoji. Fixes #295

    * Fix mocked text channel

    * Fix precondition checks. Closes #281

    * Initial fix (#297)

    * meta: bump version

    * Update from release/3.x

    * Remove more labs references

    * Remove doc file for Discord.Net.Analyzers

    Co-authored-by: Simon Hjorthøj <sh2@live.dk>
    Co-authored-by: drobbins329 <drobbins329@gmail.com>
    Co-authored-by: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com>
    Co-authored-by: d4n3436 <dan3436@hotmail.com>
    Co-authored-by: Will <WilliamWelsh@users.noreply.github.com>
    Co-authored-by: Eugene Garbuzov <kkxo.mail@gmail.com>
    Co-authored-by: CottageDwellingCat <80918250+CottageDwellingCat@users.noreply.github.com>
    Co-authored-by: Emily <89871431+emillly-b@users.noreply.github.com>
    Co-authored-by: marens101 <marens101@gmail.com>
    Co-authored-by: Jared L <48422312+lhjt@users.noreply.github.com>
    Co-authored-by: Armano den Boef <68127614+Rozen4334@users.noreply.github.com>
    Co-authored-by: Bill <billchirico@gmail.com>
    Co-authored-by: Liege72 <65319395+Liege72@users.noreply.github.com>
    Co-authored-by: Floowey <floowey@gmx.at>
    Co-authored-by: Cenk Ergen <57065323+Cenngo@users.noreply.github.com>
    Co-authored-by: exsersewo <exsersewo@systemexit.co.uk>
    Co-authored-by: Dennis Fischer <fischer_dennis@live.de>

commit 3395700720
Author: Nikon <47792796+INikonI@users.noreply.github.com>
Date:   Mon Aug 23 02:00:18 2021 +0500

    feature: IVoiceChannel implements IMentionable (#1896)

commit 41b4686b5e
Author: Quin Lynch <49576606+quinchs@users.noreply.github.com>
Date:   Tue Aug 3 20:43:10 2021 -0300

    Update README.md

commit 5fc31451a1
Author: Quin Lynch <49576606+quinchs@users.noreply.github.com>
Date:   Tue Aug 3 20:28:15 2021 -0300

    Update README.md

commit 56d16397f7
Author: roridev <t3ctotalmenterandom1@outlook.com>
Date:   Fri Nov 27 18:42:23 2020 -0300

    Fixes Azure linux build failing due to a CS8652.

commit c455b50331
Author: roridev <t3ctotalmenterandom1@outlook.com>
Date:   Fri Nov 27 14:10:39 2020 -0300

    Make use of new ValidateAndGetBestMatch api on ExecuteAsync

commit 7955a09090
Author: roridev <t3ctotalmenterandom1@outlook.com>
Date:   Fri Nov 27 13:52:53 2020 -0300

    Creates ValidateAndGetBestMatch function

    This function will validate all commands from a SearchResult and return the result of said validation, along with the command matched, if a valid match was found.

commit 574b503e9e
Author: roridev <t3ctotalmenterandom1@outlook.com>
Date:   Fri Nov 27 13:38:00 2020 -0300

    Moves CalculateScore function to outer scope.

* Update from Discord.Net dev - fix merge conflicts

* meta: .net6 support

* meta: pipelines use .net 6

* meta: bump tests framework versions

* Invoke SlashCommandExecuted event on failed type conversion (#314)

* added interaction specific interfaces

* fix build error

* implement change requests

* add autocomplete respond method to IAutocompleteInteraction

* fix sharded client current user

* fix generic typeconverter picking priority

* Revert "fix sharded client current user"

This reverts commit a9c15ffd6a.

* Revert "add autocomplete respond method to IAutocompleteInteraction"

This reverts commit f2fc50f1f1.

* fix command parsing for names with spaces

* add SlashCommandExecuted event invoke to failed type conversion

* update interactions sample app

* Revert "update interactions sample app"

This reverts commit 6ac8cd0da6.

* meta: bump to exclusive net.5 and net6 versions

Co-Authored-By: JT <Hawxy@users.noreply.github.com>

* meta: bump versions

* meta: add net461 support back

* Add System.Collections.Immutable back to core

* Fix presence NRE

* meta: bump versions

* Fix presence NRE again...

* meta: bump version

* Fix current user presence

* meta: bump version

* Fix NRE on service providerless command execution (#322)


* fix not set to an instance of an object exception for service providerless command execution

* add methods for manually registering global comands (#325)

* fix dependency injection link in docs (#326)

* Add back netstandard2.0 / 2.1. Closes #324

* meta: bump version

* Add not supported exception on news channels when creating threads, #296

* Revert thread block for news channel. Add check for news channel

Co-Authored-By: Nova Fox <novamaday@gmail.com>

* Make autocomplete log virtual (#328)

* Fix #300 again

* Update GUILD_SCHEDULED_EVENT_CREATE (#330)

Changed _guildScheduledEventCancelled to _guildScheduledEventCreated in GUILD_SCHEDULED_EVENT_CREATE

* correct the number of allowed autocomplete choices (#333)

* correct the number of allowed autocomplete choices (#334)

* Add FollowupWithFileAsync to IDiscordInteraction (#336)

* Add uppercase character check to SlashCommandBuilder and ApplicationCommandOptionProperties (#339)

* Make IModuleBase and IInteractionModuleBase public (#341)

* fix command validation (#335)

* fix autocomplete command traversal and use IList<string> in command map instead of stirng[] (#342)

* Refactor Interactions (#340)

* Refactor Interactions

* Remove ApplicationCommandException

* Fix Module Preconditions (#343)

* fix module preconditions

* fix module preconditions

* meta: bump version

* Update autocomplete docs

* Initial preps

* Fix #347

This comit makes `Content` optional for webhook execution. This comit also adds null checks to content when creating the api args to properly specify the optional struct to the model. This is done so the message entity doesn't try to parse a null string.

* Fix merge errors

* meta: net5 and 6 support

* Update README.md

* meta: bump version

* Trim SlashCommandInfo.ToString() (#346)

Co-authored-by: TheStachelfisch <TheStachelfisch@users.noreply.github.com>

* Ensure User Left Event (#349)

* Update README.md

* Add 50055 Error code (#352)

Co-authored-by: quin lynch <lynchquin@gmail.com>

* remove DeleteUnknownSlashCommandAck (#353)

* [Robot] Add missing json error (#354)

* Add 20029 Error code

* Update DiscordErrorCode.cs

Co-authored-by: Robot
Co-authored-by: Quin Lynch <49576606+quinchs@users.noreply.github.com>

* Fix #355 and make UpdateAsync return a RestInteractionResponse

* fix: unclear parameter naming for MessageCommand (#361)

* Update DiscordRestApiClient.cs (#357)

Add missing check to Content value to prevent NRE on empty message. 
Also made `ModifyInteractionFollowupMessageAsync`'s check consistent with `CreateInteractionFollowupMessageAsync`

* Introduce emoji role property into rolehelper (#360)

* Introduce emoji role property into rolehelper

* Add check for exclusive properties

* Oversight resolved

* Valid order for error responses

* Appending suggestions

* Rename component to components (#363)

* Adding BotHTTPInteraction user flag

* change component -> components

* added Interactions project

* make SearchResult public (#365)

* add missing coin emoji (#367)

https://github.com/Discord-Net-Labs/Discord.Net-Labs/issues/364

* Add `IsAutocomplete` to rest command options (#368)

* Make RestMessageComponent public (#369)

* Docs rework, prep for merge into DNET (#359)

* Appending previous changes

* Deprecating unique feature listing & unused branch

* Getting rid of old faq

* Add all missed changelog entries

This was painful :'')

* Appending suggestions, large interior rework

* Deleting unused entries

* Removing more unused entries

* Recover accidental deletion & append docfx file

* Resolve a few docfx errors

* Resolving more docfx errors

* Clearing up final warnings

* Appending suggestions

* Removing main nightly for dnetlabs

* Discord link updates

* Add migration guide

* Update v2_to_v3_guide.md

* Fix spelling mistake

Co-authored-by: quin lynch <lynchquin@gmail.com>

* Update docFX plugins and xrefs

* Add changelog and remove old docs

Co-authored-by: Simon Hjorthøj <sh2@live.dk>
Co-authored-by: Eugene Garbuzov <kkxo.mail@gmail.com>
Co-authored-by: CottageDwellingCat <80918250+CottageDwellingCat@users.noreply.github.com>
Co-authored-by: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com>
Co-authored-by: Will <WilliamWelsh@users.noreply.github.com>
Co-authored-by: Emily <89871431+emillly-b@users.noreply.github.com>
Co-authored-by: marens101 <marens101@gmail.com>
Co-authored-by: d4n3436 <dan3436@hotmail.com>
Co-authored-by: Jared L <48422312+lhjt@users.noreply.github.com>
Co-authored-by: Armano den Boef <68127614+Rozen4334@users.noreply.github.com>
Co-authored-by: Bill <billchirico@gmail.com>
Co-authored-by: KeylAmi <drobbins329@gmail.com>
Co-authored-by: Liege72 <65319395+Liege72@users.noreply.github.com>
Co-authored-by: Floowey <floowey@gmx.at>
Co-authored-by: Cenk Ergen <57065323+Cenngo@users.noreply.github.com>
Co-authored-by: exsersewo <exsersewo@systemexit.co.uk>
Co-authored-by: Dennis Fischer <fischer_dennis@live.de>
Co-authored-by: PoolPirate <94938310+PoolPirate@users.noreply.github.com>
Co-authored-by: Playwo <eliaswolf2001@t-online.de>
Co-authored-by: JT <Hawxy@users.noreply.github.com>
Co-authored-by: Nova Fox <novamaday@gmail.com>
Co-authored-by: Daan van den Hoek <28300783+daanvandenhoek@users.noreply.github.com>
Co-authored-by: nev-r <gh@f-m.fm>
Co-authored-by: TheStachelfisch <50026847+TheStachelfisch@users.noreply.github.com>
Co-authored-by: TheStachelfisch <TheStachelfisch@users.noreply.github.com>
Co-authored-by: Discord-NET-Robot <95661365+Discord-NET-Robot@users.noreply.github.com>
Co-authored-by: Xeno <eliotd@gmail.com>
tags/3.0.0
Quin Lynch GitHub 3 years ago
parent
commit
5a7e43a8cb
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
100 changed files with 1380 additions and 879 deletions
  1. +127
    -2
      CHANGELOG.md
  2. +3
    -3
      CONTRIBUTING.md
  3. +4
    -0
      README.md
  4. +2
    -2
      docs/_overwrites/Commands/ICommandContext.Inclusion.md
  5. BIN
      docs/_template/description-generator/plugins/DocFX.Plugin.DescriptionGenerator.dll
  6. +8
    -0
      docs/_template/description-generator/plugins/LICENSE
  7. BIN
      docs/_template/last-modified/plugins/LastModifiedPostProcessor.dll
  8. BIN
      docs/_template/last-modified/plugins/LibGit2Sharp.dll
  9. +2
    -2
      docs/_template/last-modified/plugins/LibGit2Sharp.dll.config
  10. BIN
      docs/_template/last-modified/plugins/lib/linux-arm/libgit2-6777db8.so
  11. BIN
      docs/_template/last-modified/plugins/lib/linux-arm64/libgit2-6777db8.so
  12. BIN
      docs/_template/last-modified/plugins/lib/linux-musl-x64/libgit2-6777db8.so
  13. BIN
      docs/_template/last-modified/plugins/lib/linux-x64/libgit2-6777db8.so
  14. BIN
      docs/_template/last-modified/plugins/lib/osx/libgit2-6777db8.dylib
  15. BIN
      docs/_template/last-modified/plugins/lib/win32/x64/git2-6777db8.dll
  16. BIN
      docs/_template/last-modified/plugins/lib/win32/x86/git2-6777db8.dll
  17. +1
    -1
      docs/_template/light-dark-theme/partials/head.tmpl.partial
  18. +37
    -30
      docs/docfx.json
  19. +21
    -21
      docs/faq/basics/basic-operations.md
  20. +5
    -3
      docs/faq/basics/client-basics.md
  21. +1
    -1
      docs/faq/basics/getting-started.md
  22. BIN
      docs/faq/basics/images/scope.png
  23. +84
    -0
      docs/faq/basics/interactions.md
  24. +21
    -0
      docs/faq/basics/samples/registerint.cs
  25. +1
    -1
      docs/faq/commands/dependency-injection.md
  26. +3
    -3
      docs/faq/commands/general.md
  27. +52
    -0
      docs/faq/commands/interaction.md
  28. +44
    -4
      docs/faq/misc/glossary.md
  29. +2
    -2
      docs/faq/misc/legacy.md
  30. +5
    -1
      docs/faq/toc.yml
  31. +2
    -3
      docs/guides/concepts/entities.md
  32. BIN
      docs/guides/getting_started/images/nightlies-vs-note.png
  33. BIN
      docs/guides/getting_started/images/nightlies-vs-step1.png
  34. BIN
      docs/guides/getting_started/images/nightlies-vs-step2.png
  35. BIN
      docs/guides/getting_started/images/nightlies-vs-step4.png
  36. +36
    -34
      docs/guides/getting_started/installing.md
  37. +30
    -0
      docs/guides/getting_started/labs.md
  38. +0
    -97
      docs/guides/getting_started/nightlies.md
  39. +10
    -5
      docs/guides/int_basics/application-commands/context-menu-commands/creating-context-menu-commands.md
  40. +0
    -0
      docs/guides/int_basics/application-commands/context-menu-commands/receiving-context-menu-command-events.md
  41. +51
    -0
      docs/guides/int_basics/application-commands/intro.md
  42. +0
    -0
      docs/guides/int_basics/application-commands/slash-commands/bulk-overwrite-of-global-slash-commands.md
  43. +0
    -0
      docs/guides/int_basics/application-commands/slash-commands/choice-slash-command.md
  44. +0
    -0
      docs/guides/int_basics/application-commands/slash-commands/creating-slash-commands.md
  45. +0
    -0
      docs/guides/int_basics/application-commands/slash-commands/images/ephemeral1.png
  46. +0
    -0
      docs/guides/int_basics/application-commands/slash-commands/images/feedback1.png
  47. +0
    -0
      docs/guides/int_basics/application-commands/slash-commands/images/feedback2.png
  48. +0
    -0
      docs/guides/int_basics/application-commands/slash-commands/images/listroles1.png
  49. +0
    -0
      docs/guides/int_basics/application-commands/slash-commands/images/listroles2.png
  50. +0
    -0
      docs/guides/int_basics/application-commands/slash-commands/images/oauth.png
  51. +0
    -0
      docs/guides/int_basics/application-commands/slash-commands/images/settings1.png
  52. +0
    -0
      docs/guides/int_basics/application-commands/slash-commands/images/settings2.png
  53. +0
    -0
      docs/guides/int_basics/application-commands/slash-commands/images/settings3.png
  54. +0
    -0
      docs/guides/int_basics/application-commands/slash-commands/images/slashcommand1.png
  55. +0
    -0
      docs/guides/int_basics/application-commands/slash-commands/images/slashcommand2.png
  56. +0
    -0
      docs/guides/int_basics/application-commands/slash-commands/parameters.md
  57. +0
    -0
      docs/guides/int_basics/application-commands/slash-commands/responding-ephemerally.md
  58. +0
    -0
      docs/guides/int_basics/application-commands/slash-commands/responding-to-slash-commands.md
  59. +0
    -0
      docs/guides/int_basics/application-commands/slash-commands/subcommands.md
  60. +0
    -0
      docs/guides/int_basics/intro.md
  61. +0
    -0
      docs/guides/int_basics/message-components/advanced.md
  62. +0
    -0
      docs/guides/int_basics/message-components/buttons-in-depth.md
  63. +0
    -0
      docs/guides/int_basics/message-components/images/image1.png
  64. +0
    -0
      docs/guides/int_basics/message-components/images/image2.png
  65. +0
    -0
      docs/guides/int_basics/message-components/images/image3.png
  66. +0
    -0
      docs/guides/int_basics/message-components/images/image4.png
  67. +0
    -0
      docs/guides/int_basics/message-components/images/image5.png
  68. +0
    -0
      docs/guides/int_basics/message-components/images/image6.png
  69. +1
    -1
      docs/guides/int_basics/message-components/intro.md
  70. +0
    -0
      docs/guides/int_basics/message-components/responding-to-buttons.md
  71. +0
    -0
      docs/guides/int_basics/message-components/select-menus.md
  72. +47
    -0
      docs/guides/int_framework/autocompletion.md
  73. +13
    -0
      docs/guides/int_framework/dependency-injection.md
  74. +353
    -0
      docs/guides/int_framework/intro.md
  75. +69
    -0
      docs/guides/int_framework/post-execution.md
  76. +77
    -0
      docs/guides/int_framework/preconditions.md
  77. +9
    -0
      docs/guides/int_framework/samples/intro/autocomplete.cs
  78. +5
    -0
      docs/guides/int_framework/samples/intro/button.cs
  79. +5
    -0
      docs/guides/int_framework/samples/intro/channelattribute.cs
  80. +14
    -0
      docs/guides/int_framework/samples/intro/context.cs
  81. +11
    -0
      docs/guides/int_framework/samples/intro/dropdown.cs
  82. +21
    -0
      docs/guides/int_framework/samples/intro/groupattribute.cs
  83. +5
    -0
      docs/guides/int_framework/samples/intro/messagecommand.cs
  84. +5
    -0
      docs/guides/int_framework/samples/intro/registering.cs
  85. +5
    -0
      docs/guides/int_framework/samples/intro/slashcommand.cs
  86. +1
    -0
      docs/guides/int_framework/samples/intro/summaryattribute.cs
  87. +5
    -0
      docs/guides/int_framework/samples/intro/usercommand.cs
  88. +28
    -0
      docs/guides/int_framework/samples/postexecution/error_review.cs
  89. +0
    -0
      docs/guides/int_framework/samples/preconditions/group_precondition.cs
  90. +3
    -0
      docs/guides/int_framework/samples/preconditions/precondition_usage.cs
  91. +30
    -0
      docs/guides/int_framework/samples/typeconverters/enum_converter.cs
  92. +118
    -0
      docs/guides/int_framework/typeconverters.md
  93. +0
    -32
      docs/guides/interactions/application-commands/01-getting-started.md
  94. +0
    -27
      docs/guides/interactions_framework/autocompleters.md
  95. +0
    -27
      docs/guides/interactions_framework/dependency-injection.md
  96. +0
    -360
      docs/guides/interactions_framework/intro.md
  97. +0
    -73
      docs/guides/interactions_framework/post_execution.md
  98. +0
    -8
      docs/guides/interactions_framework/preconditions.md
  99. +0
    -130
      docs/guides/interactions_framework/typeconverters.md
  100. +3
    -6
      docs/guides/introduction/intro.md

+ 127
- 2
CHANGELOG.md View File

@@ -1,7 +1,98 @@
# Changelog # Changelog


## [3.0.0] - 2021-12-13

### Added

- #1767 Add method to clear guild user cache (19a66bf)
- #1847 Bump API version to 9 (06a64b7)
- #1848 Remove obsolete sync voice regions methods and properties (ed8e573)
- #1851 Remove DM cache and fix references (7a201e9)
- #1860 Remove /users/@me call for socket and rework sharded client a bit (384ad85)
- #1863 Change GuildMemberUpdate before state to cacheable (c2e87f5)
- #1879 Add Name property to Teams (c5b4b64)
- #1896 IVoiceChannel implements IMentionable (3395700)
- #1943 Handle bidirectional usernames (10afd96)
- #1948 warn on invalid gateway intents (51e06e9)
- #1949 default application games (82276e3)
- #1923 Added Interaction Support (933ea42).
- #1923 Added Application commands (933ea42).
- #1923 Added Message Components (933ea42).
- #1923 Added Thread Channels (933ea42).
- #1923 Added Stage Channels (933ea42).
- #1923 Added Guild Events (933ea42).
- #1923 Revamped Stickers (933ea42).
- #1923 Added `TimestampTag` (933ea42).
- #1923 Added `Name` property to teams (933ea42).
- #1923 Added url validation to embeds (933ea42).
- #1923 Added `NsfwLevel` to Guilds (933ea42).
- #1923 Added helpers to `Emoji` for parsing (933ea42).
- #1923 Added banner and accent color to guild users (933ea42).
- #1923 Added `RatelimitCallback` to `RequestOptions` (933ea42).
- #1923 Added `Emoji` to roles (933ea42).
- #1923 Added `UseInteractionSnowflakeDate` to config (933ea42).
- #1923 Added checks for gateway intent in some methods. DownloadUsersAsync will throw an exception if you don't have the gateway intent enabled locally now, this will help with the vauge error that was given before (933ea42).
- #1923 Added SendFilesAsync to channels (933ea42).
- #1923 Added Attachments property to MessageProperties (933ea42).
- #1958 Added NET5.0 and NET6.0 builds (aa6bb5e).
- #1958 Added `Discord.Interactions` (aa6bb5e).

### Fixed

- #1832 Grab correct Uses value for vanity urls (8ed8714)
- #1849 Remove obsolete methods and properties (70aab6c)
- #1850 Create DM channel with id and author alone (95bae78)
- #1853 Fire GuildMemberUpdated without cached user (d176fef)
- #1854 Gateway events for DMs (a7ff6ce)
- #1858 MessageUpdated without author (8b29e0f)
- #1859 Add missing AddRef and related (de7f9b5)
- #1862 Message update without author (fabe034)
- #1864 ApiClient.CurrentUser being null (08507c0)
- #1871 Add empty role list if not present (f47001a)
- #1872 Connection deadlock when trying to Send and Disconnect (97d90b9)
- #1873 Remove OperationCanceledException handling in connecting logic (7cf8499)
- #1876 Message type (ac52a11)
- #1877 Rest message type (22bb1b0)
- #1886 Change embed description max length to 4096 (8349cd7)
- #1890 Add default avatar to WithAuthor extension (c200861)

### Misc

- #20 Update EmbedBuilder.Overwrites.md (76a878a)
- #21 Fix line about PriorityAttribute (75b74e1)
- #1152 Add characters commonly use in links to Sanitize (b9274d1)
- #1518 Add default nullable enum typereader (f7a07ae)
- #1666 Added negative TimeSpan handling (6abdfcb)
- #1852 Internal change to GetOrCreateUser (dfaaa21)
- #1861 Add MaxBitrate to the interface (e0dbe7c)
- #1865 Add null check to AllowedMentions.ToModel() (3cb662f)
- #1923 Merge Labs 3.X into dev (933ea42)
- #1941 Fix emoto try parse (900c1f4)
- #1942 Implement multi-file upload to webhooks (bc440ab)
- #1944 Add Voice binaries (b5c150d)
- #1945 Update socket presence and add new presence event (9d6dc62)
- #1946 fix NRE when adding parameters thru builders (143ca6d)
- #1947 fix sharded client current user (d5f5ae1)
- #1950 Add custom setter to Group property of ModuleBuilder to automatically invoke AddAliases (ba656e9)
- #1958 Update from Discord .Net Labs 3.4.8 (aa6bb5e)
- #1959 Update isRequired (98b03be)
- Add `MatchResult` (d1b31c8)
- Add requested changes (a92ec56)
- Fix incorrect casing on `HandleCommandPipeline` (adf3a9c)
- Merge branch 'commands/validate-get-best-match' of https://github.com/siscodeorg/Discord.Net into siscodeorg-commands/validate-get-best-match (3cd9f39)
- Merge branch 'siscodeorg-commands/validate-get-best-match' into dev (4f1fe2b)
- Remove docs build from azure pipelines (2336b98)
- use async main (125f6c7)
- #1923 Made `Hierarchy` a `IGuildUser` property.
- #1923 Changed embed discription length to 4096 (933ea42).
- #1923 Fixed gateway serialization to include nulls for API v9 (933ea42).
- #1923 Removed error log for gateway reconnects (933ea42).
- #1966 Updated docs.

## [2.4.0] - 2021-05-22 ## [2.4.0] - 2021-05-22

### Added ### Added

- #1726 Add stickers (91a9063) - #1726 Add stickers (91a9063)
- #1753 Webhook message edit & delete functionality (f67cd8e) - #1753 Webhook message edit & delete functionality (f67cd8e)
- #1757 Add ability to add/remove roles by id (4c9910c) - #1757 Add ability to add/remove roles by id (4c9910c)
@@ -12,15 +103,19 @@
- #1844 Add Discord Certified Moderator user flag (4b8d444) - #1844 Add Discord Certified Moderator user flag (4b8d444)


### Fixed ### Fixed

- #1486 Add type reader when entity type reader exists (c46daaa) - #1486 Add type reader when entity type reader exists (c46daaa)
- #1835 Cached message emoji cleanup at MESSAGE_REACTION_REMOVE_EMOJI (8afef82) - #1835 Cached message emoji cleanup at MESSAGE_REACTION_REMOVE_EMOJI (8afef82)


### Misc ### Misc

- #1778 Remove URI check from EmbedBuilder (25b04c4) - #1778 Remove URI check from EmbedBuilder (25b04c4)
- #1800 Fix spelling in SnowflakeUtils.FromSnowflake (6aff419) - #1800 Fix spelling in SnowflakeUtils.FromSnowflake (6aff419)


## [2.3.1] - 2021-03-10 ## [2.3.1] - 2021-03-10

### Fixed ### Fixed

- #1761 Deadlock in DiscordShardedClient when Ready is never received (73e5cc2) - #1761 Deadlock in DiscordShardedClient when Ready is never received (73e5cc2)
- #1773 Private methods aren't added as commands (0fc713a) - #1773 Private methods aren't added as commands (0fc713a)
- #1780 NullReferenceException in pin/unpin audit logs (f794163) - #1780 NullReferenceException in pin/unpin audit logs (f794163)
@@ -29,10 +124,13 @@
- #1794 Audit log UserId can be null (d41aeee) - #1794 Audit log UserId can be null (d41aeee)


### Misc ### Misc

- #1774 Add remark regarding CustomStatus as the activity (51b7afe) - #1774 Add remark regarding CustomStatus as the activity (51b7afe)


## [2.3.0] - 2021-01-28 ## [2.3.0] - 2021-01-28

### Added ### Added

- #1491 Add INVITE_CREATE and INVITE_DELETE events (1ab670b) - #1491 Add INVITE_CREATE and INVITE_DELETE events (1ab670b)
- #1520 Support reading multiple activities (421a0c1) - #1520 Support reading multiple activities (421a0c1)
- #1521 Allow for inherited commands in modules (a51cdf6) - #1521 Allow for inherited commands in modules (a51cdf6)
@@ -57,6 +155,7 @@
- #1690 Add max bitrate value to SocketGuild (aacfea0) - #1690 Add max bitrate value to SocketGuild (aacfea0)


### Fixed ### Fixed

- #1244 Missing AddReactions permission for DM channels. (e40ca4a) - #1244 Missing AddReactions permission for DM channels. (e40ca4a)
- #1469 unsupported property causes an exception (468f826) - #1469 unsupported property causes an exception (468f826)
- #1525 AllowedMentions and AllowedMentionTypes (3325031) - #1525 AllowedMentions and AllowedMentionTypes (3325031)
@@ -99,6 +198,7 @@
- Missing MessageReference when sending files (2095701) - Missing MessageReference when sending files (2095701)


### Misc ### Misc

- #1545 MutualGuilds optimization (323a677) - #1545 MutualGuilds optimization (323a677)
- #1551 Update webhook regex to support discord.com (7585789) - #1551 Update webhook regex to support discord.com (7585789)
- #1556 Add SearchUsersAsync (57880de) - #1556 Add SearchUsersAsync (57880de)
@@ -123,7 +223,9 @@
- Move bulk deletes remarks from <summary> to <remarks> (62539f0) - Move bulk deletes remarks from <summary> to <remarks> (62539f0)


## [2.2.0] - 2020-04-16 ## [2.2.0] - 2020-04-16

### Added ### Added

- #1247 Implement Client Status Support (9da11b4) - #1247 Implement Client Status Support (9da11b4)
- #1310 id overload for RemoveReactionAsync (c88b1da) - #1310 id overload for RemoveReactionAsync (c88b1da)
- #1319 BOOST (faf23de) - #1319 BOOST (faf23de)
@@ -146,6 +248,7 @@
- suppress messages (cd28892) - suppress messages (cd28892)


### Fixed ### Fixed

- #1318 #1314 Don't parse tags within code blocks (c977f2e) - #1318 #1314 Don't parse tags within code blocks (c977f2e)
- #1333 Remove null coalescing on ToEmbedBuilder Color (120c0f7) - #1333 Remove null coalescing on ToEmbedBuilder Color (120c0f7)
- #1337 Fixed attempting to access a non-present optional value (4edda5b) - #1337 Fixed attempting to access a non-present optional value (4edda5b)
@@ -161,11 +264,13 @@
- include MessageFlags and SuppressEmbedParams (d6d4429) - include MessageFlags and SuppressEmbedParams (d6d4429)


### Changed ### Changed

- #1368 Update ISystemMessage interface to allow reactions (07f4d5f) - #1368 Update ISystemMessage interface to allow reactions (07f4d5f)
- #1417 fix #1415 Re-add support for overwrite permissions for news channels (e627f07) - #1417 fix #1415 Re-add support for overwrite permissions for news channels (e627f07)
- use millisecond precision by default (bcb3534) - use millisecond precision by default (bcb3534)


### Misc ### Misc

- #1290 Split Unit and Integration tests into separate projects (a797be9) - #1290 Split Unit and Integration tests into separate projects (a797be9)
- #1328 Fix #1327 Color.ToString returns wrong value (1e8aa08) - #1328 Fix #1327 Color.ToString returns wrong value (1e8aa08)
- #1329 Fix invalid cref values in docs (363d1c6) - #1329 Fix invalid cref values in docs (363d1c6)
@@ -190,14 +295,16 @@
- 2.2.0 (4b602b4) - 2.2.0 (4b602b4)
- target the Process env-var scope (3c6b376) - target the Process env-var scope (3c6b376)
- fix metapackage build (1794f95) - fix metapackage build (1794f95)
- copy only _site to docs-static (a8cdadc)
- copy only \_site to docs-static (a8cdadc)
- do not exit on failed robocopy (fd204ee) - do not exit on failed robocopy (fd204ee)
- add idn debugger (91aec9f) - add idn debugger (91aec9f)
- rename IsStream to IsStreaming (dcd9cdd) - rename IsStream to IsStreaming (dcd9cdd)
- feature (40844b9) - feature (40844b9)


## [2.1.1] - 2019-06-08 ## [2.1.1] - 2019-06-08

### Fixed ### Fixed

- #994: Remainder parameters now ignore character escaping, as there is no reason to escape characters here (2e95c49) - #994: Remainder parameters now ignore character escaping, as there is no reason to escape characters here (2e95c49)
- #1316: `Emote.Equals` now pays no respect to the Name property, since Discord's API does not care about an emote's name (abf3e90) - #1316: `Emote.Equals` now pays no respect to the Name property, since Discord's API does not care about an emote's name (abf3e90)
- #1317: `Emote.GetHashCode` now pays no respect to the Name property, see above (1b54883) - #1317: `Emote.GetHashCode` now pays no respect to the Name property, see above (1b54883)
@@ -206,16 +313,20 @@
- News embeds will be processed as `EmbedType.Unknown`, rather than throwing an error and dropping the message (d287ed1) - News embeds will be processed as `EmbedType.Unknown`, rather than throwing an error and dropping the message (d287ed1)


### Changed ### Changed

- #1311: Members may now be disconnected from voice channels by passing `null` as `GuildUserProperties.Channel` (fc48c66) - #1311: Members may now be disconnected from voice channels by passing `null` as `GuildUserProperties.Channel` (fc48c66)
- #1313: `IMessage.Tags` now includes the EveryoneRole on @everyone and @here mentions (1f55f01) - #1313: `IMessage.Tags` now includes the EveryoneRole on @everyone and @here mentions (1f55f01)
- #1320: The maximum value for setting slow-mode has been updated to 6 hours, per the new API limit (4433ca7) - #1320: The maximum value for setting slow-mode has been updated to 6 hours, per the new API limit (4433ca7)


### Misc ### Misc

- This library's compatibility with Semantic Versioning has been clarified. Please see the README (4d7de17) - This library's compatibility with Semantic Versioning has been clarified. Please see the README (4d7de17)
- The depency on System.Interactive.Async has been bumped to `3.2.0` (3e65e03) - The depency on System.Interactive.Async has been bumped to `3.2.0` (3e65e03)


## [2.1.0] - 2019-05-18 ## [2.1.0] - 2019-05-18

### Added ### Added

- #1236: Bulk deletes (for messages) may now be accessed via the `MessagesBulkDeleted` event (dec353e) - #1236: Bulk deletes (for messages) may now be accessed via the `MessagesBulkDeleted` event (dec353e)
- #1240: OAuth applications utilizing the `guilds.join` scope may now add users to guilds through any client (1356ea9) - #1240: OAuth applications utilizing the `guilds.join` scope may now add users to guilds through any client (1356ea9)
- #1255: Message and attachment spoilers may now be set or detected (f3b20b2) - #1255: Message and attachment spoilers may now be set or detected (f3b20b2)
@@ -227,9 +338,11 @@
- `ExclusiveBulkDelete` configuration setting can be used to control bulk delete event behavior (03e6401) - `ExclusiveBulkDelete` configuration setting can be used to control bulk delete event behavior (03e6401)


### Removed ### Removed

- #1294: The `IGuildUser` overload of `EmbedBuilder.WithAuthor` no longer exists (b52b54d) - #1294: The `IGuildUser` overload of `EmbedBuilder.WithAuthor` no longer exists (b52b54d)


### Fixed ### Fixed

- #1256: Fetching audit logs no longer raises null reference exceptions when a webhook has been deleted (049b014) - #1256: Fetching audit logs no longer raises null reference exceptions when a webhook has been deleted (049b014)
- #1268: Null reference exceptions on `MESSAGE_CREATE` concerning partial member objects no longer occur (377622b) - #1268: Null reference exceptions on `MESSAGE_CREATE` concerning partial member objects no longer occur (377622b)
- #1278: The token validator now internally pads tokens to the proper length (48b327b) - #1278: The token validator now internally pads tokens to the proper length (48b327b)
@@ -238,9 +351,11 @@
- Exceptions in event handlers are now always logged (f6e3200) - Exceptions in event handlers are now always logged (f6e3200)


### Changed ### Changed

- #1305: Token validation will fail when tokens contain whitespace (bb61efa) - #1305: Token validation will fail when tokens contain whitespace (bb61efa)


### Misc ### Misc

- #1241: Added documentation samples for Webhooks (655a006) - #1241: Added documentation samples for Webhooks (655a006)
- #1243: Happy new year 🎉 (0275f7d) - #1243: Happy new year 🎉 (0275f7d)
- #1257: Improved clarity in comments in the command samples (2473619) - #1257: Improved clarity in comments in the command samples (2473619)
@@ -251,16 +366,20 @@
- IDisposableAnalyzers should now be a development dependency (8003ac8) - IDisposableAnalyzers should now be a development dependency (8003ac8)


## [2.0.1] - 2019-01-04 ## [2.0.1] - 2019-01-04

### Fixed ### Fixed

- #1226: Only escape the closing quotation mark of non-remainder strings (65b8c09) - #1226: Only escape the closing quotation mark of non-remainder strings (65b8c09)
- Commands with async RunModes will now propagate exceptions up to CommandExecuted (497918e) - Commands with async RunModes will now propagate exceptions up to CommandExecuted (497918e)


### Misc ### Misc

- #1225: Commands sample no longer hooks the log event twice (552f34c) - #1225: Commands sample no longer hooks the log event twice (552f34c)
- #1227: The logo on the docs index page should scale responsively (d39bf6e) - #1227: The logo on the docs index page should scale responsively (d39bf6e)
- #1230: Replaced precondition sample on docs (feed4fd) - #1230: Replaced precondition sample on docs (feed4fd)


## [2.0.0] - 2018-12-28 ## [2.0.0] - 2018-12-28

### Added ### Added


- #747: `CommandService` now has a `CommandExecuted` event (e991715) - #747: `CommandService` now has a `CommandExecuted` event (e991715)
@@ -316,6 +435,7 @@
- Reactions can now be added to messages in bulk (5421df1) - Reactions can now be added to messages in bulk (5421df1)


### Fixed ### Fixed

- #742: `DiscordShardedClient#GetGuildFor` will now direct null guilds to Shard 0 (d5e9d6f) - #742: `DiscordShardedClient#GetGuildFor` will now direct null guilds to Shard 0 (d5e9d6f)
- #743: Various issues with permissions and inheritance of permissions (f996338) - #743: Various issues with permissions and inheritance of permissions (f996338)
- #755: `IRole.Mention` will correctly tag the @everyone role (6b5a6e7) - #755: `IRole.Mention` will correctly tag the @everyone role (6b5a6e7)
@@ -363,6 +483,7 @@
- The default WebSocket will now close correctly (ac389f5) - The default WebSocket will now close correctly (ac389f5)


### Changed ### Changed

- #731: `IUserMessage#GetReactionUsersAsync` now takes an `IEmote` instead of a `string` (5d7f2fc) - #731: `IUserMessage#GetReactionUsersAsync` now takes an `IEmote` instead of a `string` (5d7f2fc)
- #744: IAsyncEnumerable has been redesigned (5bbd9bb) - #744: IAsyncEnumerable has been redesigned (5bbd9bb)
- #777: `IGuild#DefaultChannel` will now resolve the first accessible channel, per changes to Discord (1ffcd4b) - #777: `IGuild#DefaultChannel` will now resolve the first accessible channel, per changes to Discord (1ffcd4b)
@@ -397,14 +518,15 @@
- The socket client will now use additional fields to fill in member/guild information on messages (8fb2c71) - The socket client will now use additional fields to fill in member/guild information on messages (8fb2c71)
- The Audio Client now uses Voice WS v3 (9ba38d7) - The Audio Client now uses Voice WS v3 (9ba38d7)



### Removed ### Removed

- #790: Redundant overloads for `AddField` removed from EmbedBuilder (479361b) - #790: Redundant overloads for `AddField` removed from EmbedBuilder (479361b)
- #925: RPC is no longer being maintained nor packaged (b30af57) - #925: RPC is no longer being maintained nor packaged (b30af57)
- #958: Remove support for user tokens (2fd4f56) - #958: Remove support for user tokens (2fd4f56)
- User logins (including selfbots) are no longer supported (fc5adca) - User logins (including selfbots) are no longer supported (fc5adca)


### Misc ### Misc

- #786: Unit tests for the Color structure (22b969c) - #786: Unit tests for the Color structure (22b969c)
- #828: We now include a contributing guide (cd82a0f) - #828: We now include a contributing guide (cd82a0f)
- #876: We now include a standard editorconfig (5c8c784) - #876: We now include a standard editorconfig (5c8c784)
@@ -425,11 +547,13 @@
- Fixed documentation layout for the logo (bafdce4) - Fixed documentation layout for the logo (bafdce4)


## [1.0.2] - 2017-09-09 ## [1.0.2] - 2017-09-09

### Fixed ### Fixed


- Guilds utilizing Channel Categories will no longer crash bots on the `READY` event. - Guilds utilizing Channel Categories will no longer crash bots on the `READY` event.


## [1.0.1] - 2017-07-05 ## [1.0.1] - 2017-07-05

### Fixed ### Fixed


- #732: Fixed parameter preconditions not being loaded from class-based modules (b6dcc9e) - #732: Fixed parameter preconditions not being loaded from class-based modules (b6dcc9e)
@@ -438,4 +562,5 @@
- Fixed module auto-detection for nested modules (d2afb06) - Fixed module auto-detection for nested modules (d2afb06)


### Changed ### Changed

- ShardedCommandContext now inherits from SocketCommandContext (8cd99be) - ShardedCommandContext now inherits from SocketCommandContext (8cd99be)

+ 3
- 3
CONTRIBUTING.md View File

@@ -17,7 +17,7 @@ any member of the community.


We prefer pull-requests that are descriptive of the changes being made We prefer pull-requests that are descriptive of the changes being made
and highlight any potential benefits/drawbacks of the change, but these and highlight any potential benefits/drawbacks of the change, but these
types of write-ups are not required. See this [merge request](https://github.com/RogueException/Discord.Net/pull/793)
types of write-ups are not required. See this [merge request](https://github.com/discord-net/Discord.Net/pull/793)
for an example of a well-written description. for an example of a well-written description.


## Semantic Versioning ## Semantic Versioning
@@ -28,7 +28,7 @@ that are SemVer compliant with the latest version of the library in
development. development.


The working release should be the latest build off of the `dev` branch, The working release should be the latest build off of the `dev` branch,
but can also be found on the [development board](https://github.com/RogueException/Discord.Net/projects/1).
but can also be found on the [development board](https://github.com/discord-net/Discord.Net/projects/1).


We follow the .NET Foundation's [Breaking Change Rules](https://github.com/dotnet/corefx/blob/master/Documentation/coding-guidelines/breaking-change-rules.md) We follow the .NET Foundation's [Breaking Change Rules](https://github.com/dotnet/corefx/blob/master/Documentation/coding-guidelines/breaking-change-rules.md)
when determining the SemVer compliance of a change. when determining the SemVer compliance of a change.
@@ -59,4 +59,4 @@ The length of the documentation should also follow the ruler as suggested by our
#### Recommended Reads #### Recommended Reads


* [Official Microsoft Documentation](https://docs.microsoft.com) * [Official Microsoft Documentation](https://docs.microsoft.com)
* [Sandcastle User Manual](https://ewsoftware.github.io/XMLCommentsGuide/html/4268757F-CE8D-4E6D-8502-4F7F2E22DDA3.htm)
* [Sandcastle User Manual](https://ewsoftware.github.io/XMLCommentsGuide/html/4268757F-CE8D-4E6D-8502-4F7F2E22DDA3.htm)

+ 4
- 0
README.md View File

@@ -31,6 +31,10 @@ The individual components may also be installed from NuGet:


Nightly builds are available through our MyGet feed (`https://www.myget.org/F/discord-net/api/v3/index.json`). Nightly builds are available through our MyGet feed (`https://www.myget.org/F/discord-net/api/v3/index.json`).


### Unstable (Labs)

Labs builds are avaiable on nuget (`https://www.nuget.org/packages/Discord.Net.Labs/`) and myget (`https://www.myget.org/F/discord-net-labs/api/v3/index.json`).

## Compiling ## Compiling


In order to compile Discord.Net, you require the following: In order to compile Discord.Net, you require the following:


+ 2
- 2
docs/_overwrites/Commands/ICommandContext.Inclusion.md View File

@@ -1,5 +1,5 @@
An example of how this class is used the command system can be seen An example of how this class is used the command system can be seen
below: below:


[!code[Sample module](../../guides/commands/samples/intro/empty-module.cs)]
[!code[Command handler](../../guides/commands/samples/intro/command_handler.cs)]
[!code[Sample module](../../guides/text_commands/samples/intro/empty-module.cs)]
[!code[Command handler](../../guides/text_commands/samples/intro/command_handler.cs)]

BIN
docs/_template/description-generator/plugins/DocFX.Plugin.DescriptionGenerator.dll View File


+ 8
- 0
docs/_template/description-generator/plugins/LICENSE View File

@@ -19,3 +19,11 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.

==============================================================================

Humanizer (https://github.com/Humanizr/Humanizer)
The MIT License (MIT)
Copyright (c) .NET Foundation and Contributors

==============================================================================

BIN
docs/_template/last-modified/plugins/LastModifiedPostProcessor.dll View File


BIN
docs/_template/last-modified/plugins/LibGit2Sharp.dll View File


+ 2
- 2
docs/_template/last-modified/plugins/LibGit2Sharp.dll.config View File

@@ -1,4 +1,4 @@
<configuration> <configuration>
<dllmap os="linux" cpu="x86-64" wordsize="64" dll="git2-ef5a385" target="lib/linux-x64/libgit2-ef5a385.so" />
<dllmap os="osx" cpu="x86,x86-64" dll="git2-ef5a385" target="lib/osx/libgit2-ef5a385.dylib" />
<dllmap os="linux" cpu="x86-64" wordsize="64" dll="git2-6777db8" target="lib/linux-x64/libgit2-6777db8.so" />
<dllmap os="osx" cpu="x86,x86-64" dll="git2-6777db8" target="lib/osx/libgit2-6777db8.dylib" />
</configuration> </configuration>

BIN
docs/_template/last-modified/plugins/lib/linux-arm/libgit2-6777db8.so View File


BIN
docs/_template/last-modified/plugins/lib/linux-arm64/libgit2-6777db8.so View File


BIN
docs/_template/last-modified/plugins/lib/linux-musl-x64/libgit2-6777db8.so View File


BIN
docs/_template/last-modified/plugins/lib/linux-x64/libgit2-6777db8.so View File


BIN
docs/_template/last-modified/plugins/lib/osx/libgit2-6777db8.dylib View File


BIN
docs/_template/last-modified/plugins/lib/win32/x64/git2-6777db8.dll View File


BIN
docs/_template/last-modified/plugins/lib/win32/x86/git2-6777db8.dll View File


+ 1
- 1
docs/_template/light-dark-theme/partials/head.tmpl.partial View File

@@ -10,7 +10,7 @@
<meta property="og:locale" content="en-us"> <meta property="og:locale" content="en-us">
<meta property="og:type" content="website"> <meta property="og:type" content="website">
<meta property="og:site_name" content="Discord.Net Docs"> <meta property="og:site_name" content="Discord.Net Docs">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/discord-net/Discord.Net/docs/marketing/logo/PackageLogo.png">
<meta property="og:image" content="https://raw.githubusercontent.com/Discord-Net/Discord.Net/dev/docs/marketing/logo/PackageLogo.png">
<meta property="og:image:alt" content="Discord.Net Logo"> <meta property="og:image:alt" content="Discord.Net Logo">
<meta name="theme-color" content="#995EA7"/> <meta name="theme-color" content="#995EA7"/>
<meta name="generator" content="docfx {{_docfxVersion}}"> <meta name="generator" content="docfx {{_docfxVersion}}">


+ 37
- 30
docs/docfx.json View File

@@ -1,19 +1,22 @@
{ {
"metadata": [{
"src": [{
"src": "../src",
"files": [
"**.csproj"
]
}],
"dest": "api",
"filter": "filterConfig.yml",
"properties": {
"TargetFramework": "netstandard2.0"
"metadata": [
{
"src": [
{
"src": "../src",
"files": ["**.csproj"]
}
],
"dest": "api",
"filter": "filterConfig.yml",
"properties": {
"TargetFramework": "net5.0"
}
} }
}],
],
"build": { "build": {
"content": [{
"content": [
{
"files": ["api/**.yml", "api/index.md"] "files": ["api/**.yml", "api/index.md"]
}, },
{ {
@@ -27,19 +30,21 @@
}, },
{ {
"src": "../", "src": "../",
"files": [ "CHANGELOG.md" ]
"files": ["CHANGELOG.md"]
}
],
"resource": [
{
"files": [
"**/images/**",
"**/samples/**",
"langwordMapping.yml",
"marketing/logo/**.svg",
"marketing/logo/**.png",
"favicon.ico"
]
} }
], ],
"resource": [{
"files": [
"**/images/**",
"**/samples/**",
"langwordMapping.yml",
"marketing/logo/**.svg",
"marketing/logo/**.png",
"favicon.ico"
]
}],
"dest": "_site", "dest": "_site",
"template": [ "template": [
"default", "default",
@@ -47,17 +52,19 @@
"_template/last-modified", "_template/last-modified",
"_template/description-generator" "_template/description-generator"
], ],
"postProcessors": ["ExtractSearchIndex", "LastModifiedPostProcessor", "DescriptionPostProcessor"],
"postProcessors": [
"ExtractSearchIndex",
"LastModifiedPostProcessor",
"DescriptionPostProcessor"
],
"overwrite": "_overwrites/**/**.md", "overwrite": "_overwrites/**/**.md",
"globalMetadata": { "globalMetadata": {
"_appTitle": "Discord.Net Documentation", "_appTitle": "Discord.Net Documentation",
"_appFooter": "Discord.Net (c) 2015-2020 2.2.0",
"_appFooter": "Discord.Net (c) 2015-2021 3.0.0",
"_enableSearch": true, "_enableSearch": true,
"_appLogoPath": "marketing/logo/SVG/Logomark Purple.svg", "_appLogoPath": "marketing/logo/SVG/Logomark Purple.svg",
"_appFaviconPath": "favicon.ico"
"_appFaviconPath": "favicon.ico"
}, },
"xrefService": [
"https://xref.docs.microsoft.com/query?uid={uid}"
]
"xrefService": ["https://xref.docs.microsoft.com/query?uid={uid}"]
} }
} }

+ 21
- 21
docs/faq/basics/basic-operations.md View File

@@ -13,7 +13,7 @@ language-specific tips when using this library.


> [!WARNING] > [!WARNING]
> Direct casting (e.g., `(Type)type`) is **the least recommended** > Direct casting (e.g., `(Type)type`) is **the least recommended**
> way of casting, as it *can* throw an [InvalidCastException]
> way of casting, as it _can_ throw an [InvalidCastException]
> when the object isn't the desired type. > when the object isn't the desired type.
> >
> Please refer to [this post] for more details. > Please refer to [this post] for more details.
@@ -26,7 +26,7 @@ A good and safe casting example:


[!code-csharp[Casting](samples/cast.cs)] [!code-csharp[Casting](samples/cast.cs)]


[InvalidCastException]: https://docs.microsoft.com/en-us/dotnet/api/system.invalidcastexception
[invalidcastexception]: https://docs.microsoft.com/en-us/dotnet/api/system.invalidcastexception
[this post]: https://docs.microsoft.com/en-us/dotnet/csharp/how-to/safely-cast-using-pattern-matching-is-and-as-operators [this post]: https://docs.microsoft.com/en-us/dotnet/csharp/how-to/safely-cast-using-pattern-matching-is-and-as-operators


## How do I send a message? ## How do I send a message?
@@ -45,15 +45,15 @@ means casting is your friend. You should attempt to cast the channel
as an [IMessageChannel] or any other entity that implements it to be as an [IMessageChannel] or any other entity that implements it to be
able to message. able to message.


[SendMessageAsync]: xref:Discord.IMessageChannel.SendMessageAsync*
[GetChannel]: xref:Discord.WebSocket.DiscordSocketClient.GetChannel*
[sendmessageasync]: xref:Discord.IMessageChannel.SendMessageAsync*
[getchannel]: xref:Discord.WebSocket.DiscordSocketClient.GetChannel*


## How can I tell if a message is from X, Y, Z channel? ## How can I tell if a message is from X, Y, Z channel?


You may check the message channel type. Visit [Glossary] to see the You may check the message channel type. Visit [Glossary] to see the
various types of channels. various types of channels.


[Glossary]: xref:FAQ.Glossary#message-channels
[glossary]: xref:FAQ.Glossary#message-channels


## How can I get the guild from a message? ## How can I get the guild from a message?


@@ -86,9 +86,9 @@ implement [IEmote] and are valid options.


[!code-csharp[Emoji](samples/emoji-self.cs)] [!code-csharp[Emoji](samples/emoji-self.cs)]


***
---


[AddReactionAsync]: xref:Discord.IMessage.AddReactionAsync*
[addreactionasync]: xref:Discord.IMessage.AddReactionAsync*


## What is a "preemptive rate limit?" ## What is a "preemptive rate limit?"


@@ -107,17 +107,17 @@ reactions.


## Can I opt-out of preemptive rate limits? ## Can I opt-out of preemptive rate limits?


Unfortunately, not at the moment. See [#401](https://github.com/RogueException/Discord.Net/issues/401).
[IChannel]: xref:Discord.IChannel
[ICategoryChannel]: xref:Discord.ICategoryChannel
[IGuildChannel]: xref:Discord.IGuildChannel
[ITextChannel]: xref:Discord.ITextChannel
[IGuild]: xref:Discord.IGuild
[IVoiceChannel]: xref:Discord.IVoiceChannel
[IGuildUser]: xref:Discord.IGuildUser
[IMessageChannel]: xref:Discord.IMessageChannel
[IUserMessage]: xref:Discord.IUserMessage
[IEmote]: xref:Discord.IEmote
[Emote]: xref:Discord.Emote
[Emoji]: xref:Discord.Emoji
Unfortunately, not at the moment. See [#401](https://github.com/discord-net/Discord.Net/issues/401).
[ichannel]: xref:Discord.IChannel
[icategorychannel]: xref:Discord.ICategoryChannel
[iguildchannel]: xref:Discord.IGuildChannel
[itextchannel]: xref:Discord.ITextChannel
[iguild]: xref:Discord.IGuild
[ivoicechannel]: xref:Discord.IVoiceChannel
[iguilduser]: xref:Discord.IGuildUser
[imessagechannel]: xref:Discord.IMessageChannel
[iusermessage]: xref:Discord.IUserMessage
[iemote]: xref:Discord.IEmote
[emote]: xref:Discord.Emote
[emoji]: xref:Discord.Emoji

+ 5
- 3
docs/faq/basics/client-basics.md View File

@@ -28,8 +28,8 @@ There are few possible reasons why this may occur.
mind that a token is **different** from a *client secret*. mind that a token is **different** from a *client secret*.


[TokenType]: xref:Discord.TokenType [TokenType]: xref:Discord.TokenType
[827]: https://github.com/RogueException/Discord.Net/issues/827
[958]: https://github.com/RogueException/Discord.Net/issues/958
[827]: https://github.com/discord-net/Discord.Net/issues/827
[958]: https://github.com/discord-net/Discord.Net/issues/958
[Discord API Terms of Service]: https://discord.com/developers/docs/legal [Discord API Terms of Service]: https://discord.com/developers/docs/legal


## How do I do X, Y, Z when my bot connects/logs on? Why do I get a `NullReferenceException` upon calling any client methods after connect? ## How do I do X, Y, Z when my bot connects/logs on? Why do I get a `NullReferenceException` upon calling any client methods after connect?
@@ -73,7 +73,9 @@ instances, with each one serving a different amount of guilds.
There are very few differences from the [DiscordSocketClient] class, and it is very straightforward There are very few differences from the [DiscordSocketClient] class, and it is very straightforward
to modify your existing code to use a [DiscordShardedClient] when necessary. to modify your existing code to use a [DiscordShardedClient] when necessary.


1. You need to specify the total amount of shards, or shard ids, via [DiscordShardedClient]'s constructors.
1. You can specify the total amount of shards, or shard ids, via [DiscordShardedClient]'s constructors.
If the total shards are not specified then the library will get the recommended shard count via the
[Get Gateway Bot](https://discord.com/developers/docs/topics/gateway#get-gateway-bot) route.
2. The [Connected], [Disconnected], [Ready], and [LatencyUpdated] events 2. The [Connected], [Disconnected], [Ready], and [LatencyUpdated] events
are replaced with [ShardConnected], [ShardDisconnected], [ShardReady], and [ShardLatencyUpdated]. are replaced with [ShardConnected], [ShardDisconnected], [ShardReady], and [ShardLatencyUpdated].
3. Every event handler you apply/remove to the [DiscordShardedClient] is applied/removed to each shard. 3. Every event handler you apply/remove to the [DiscordShardedClient] is applied/removed to each shard.


+ 1
- 1
docs/faq/basics/getting-started.md View File

@@ -79,4 +79,4 @@ Several common ways to do this:
![Roles](images/role-copy.png) ![Roles](images/role-copy.png)
2. Make the role mentionable and mention the role, and escape it 2. Make the role mentionable and mention the role, and escape it
using the `\` character in front. using the `\` character in front.
3. Inspect the roles collection within the guild via your debugger.
3. Inspect the roles collection within the guild via your debugger.

BIN
docs/faq/basics/images/scope.png View File

Before After
Width: 446  |  Height: 317  |  Size: 16 KiB

+ 84
- 0
docs/faq/basics/interactions.md View File

@@ -0,0 +1,84 @@
---
uid: FAQ.Basics.InteractionBasics
title: Basics of interactions, common practice
---

# Interactions basics, where to get started

This section answers basic questions and common mistakes in handling application commands, and responding to them.

## What's the difference between RespondAsync, DeferAsync and FollowupAsync?

The difference between these 3 functions is in how you handle the command response.
[RespondAsync] and
[DeferAsync] let the API know you have succesfully received the command. This is also called 'acknowledging' a command.
DeferAsync will not send out a response, RespondAsync will.
[FollowupAsync] follows up on succesful acknowledgement.

> [!WARNING]
> If you have not acknowledged the command FollowupAsync will not work! the interaction has not been resonded to, so you cannot follow it up!

[RespondAsync]: xref:Discord.IDiscordInteraction
[DeferAsync]: xref:Discord.IDiscordInteraction
[FollowUpAsync]: xref:Discord.IDiscordInteraction

## Bad form Exception when I try to create my commands, why do I get this?

Bad form exceptions are thrown if the slash, user or message command builder has invalid values.
The following options could resolve your error.

#### Is your command name lowercase?

If your command name is not lowercase, it is not seen as a valid command entry.
`Avatar` is invalid; `avatar` is valid.

#### Are your values below or above the required amount? (This also applies to message components)

Discord expects all values to be below maximum allowed.
Going over this maximum amount of characters causes an exception.

> [!NOTE]
> All maximum and minimum value requirements can be found in the [Discord Developer Docs].
> For components, structure documentation is found [here].

[Discord Developer Docs]: https://discord.com/developers/docs/interactions/application-commands#application-commands
[here]: https://discord.com/developers/docs/interactions/message-components#message-components

#### Is your subcommand branching correct?

Branching structure is covered properly here: xref:Guides.SlashCommands.SubCommand

## My interaction commands are not showing up?

If you registered your commands globally, it can take up to 1 hour for them to register.
Did you register a guild command (should be instant), or waited more than an hour and still don't have them show up?

- Try to check for any errors in the console, there is a good chance something might have been thrown.

- Register your commands after the Ready event in the client. The client is not configured to register commands before this moment.

- Check if no bad form exception is thrown; If so, refer to the above question.

- Do you have the application commands scope checked when adding your bot to guilds?

![Scope check](images/scope.png)

## There are many options for creating commands, which do I use?

[!code-csharp[Register examples](samples/registerint.cs)]

> [!NOTE]
> You can use bulkoverwrite even if there are no commands in guild, nor globally.
> The bulkoverwrite method disposes the old set of commands and replaces it with the new.

## Do I need to create commands on startup?

If you are registering your commands for the first time, it is required to create them once.
After this, commands will exist indefinitely until you overwrite them.
Overwriting is only required if you make changes to existing commands, or add new ones.

## I can't see all of my user/message commands, why?

Message and user commands have a limit of 5 per guild, and another 5 globally.
If you have more than 5 guild-only message commands being registered, no more than 5 will actually show up.
You can get up to 10 entries to show if you register 5 per guild, and another 5 globally.

+ 21
- 0
docs/faq/basics/samples/registerint.cs View File

@@ -0,0 +1,21 @@
private async Task ReadyAsync()
{
// pull your commands from some array, everyone has a different approach for this.
var commands = _builders.ToArray();

// write your list of commands globally in one go.
await _client.Rest.BulkOverwriteGlobalCommands(commands);

// write your array of commands to one guild in one go.
// You can do a foreach (... in _client.Guilds) approach to write to all guilds.
await _client.Rest.BulkOverwriteGuildCommands(commands, /* some guild ID */);

foreach (var c in commands)
{
// Create a global command, repeating usage for multiple commands.
await _client.Rest.CreateGlobalCommand(c);

// Create a guild command, repeating usage for multiple commands.
await _client.Rest.CreateGuildCommand(c, guildId);
}
}

+ 1
- 1
docs/faq/commands/dependency-injection.md View File

@@ -23,7 +23,7 @@ throughout execution. Think of it like a chest that holds
whatever you throw at it that won't be affected by anything unless whatever you throw at it that won't be affected by anything unless
you want it to. Note that you should also learn Microsoft's you want it to. Note that you should also learn Microsoft's
implementation of [Dependency Injection] \([video]) before proceeding, implementation of [Dependency Injection] \([video]) before proceeding,
as well as how it works in [Discord.Net](xref:Guides.Commands.DI#usage-in-modules).
as well as how it works in [Discord.Net](xref:Guides.TextCommands.DI#usage-in-modules).


A brief example of service and dependency injection can be seen below. A brief example of service and dependency injection can be seen below.




+ 3
- 3
docs/faq/commands/general.md View File

@@ -1,9 +1,9 @@
--- ---
uid: FAQ.Commands.General uid: FAQ.Commands.General
title: General Questions about Commands
title: General Questions about chat Commands
--- ---


# Command-related Questions
# Chat Command-related Questions


In the following section, you will find commonly asked questions and In the following section, you will find commonly asked questions and
answered regarding general command usage when using @Discord.Commands. answered regarding general command usage when using @Discord.Commands.
@@ -144,4 +144,4 @@ For #4, exceptions are caught in [CommandService.Log] event under
[LogMessage.Exception]: xref:Discord.LogMessage.Exception* [LogMessage.Exception]: xref:Discord.LogMessage.Exception*
[ExecuteResult.Exception]: xref:Discord.Commands.ExecuteResult.Exception* [ExecuteResult.Exception]: xref:Discord.Commands.ExecuteResult.Exception*
[CommandException]: xref:Discord.Commands.CommandException [CommandException]: xref:Discord.Commands.CommandException
[IResult]: xref:Discord.Commands.IResult
[IResult]: xref:Discord.Commands.IResult

+ 52
- 0
docs/faq/commands/interaction.md View File

@@ -0,0 +1,52 @@
---
uid: FAQ.Commands.Interactions
title: Interaction service
---

# Interaction commands in services

A chapter talking about the interaction service framework.
For questions about interactions in general, refer to the [Interactions FAQ]

## Module dependencies aren't getting populated by Property Injection?

Make sure the properties are publicly accessible and publicly settable.

## How do I use this * interaction specific method/property?

If your interaction context holds a down-casted version of the interaction object, you need to up-cast it.
Ideally, use pattern matching to make sure its the type of interaction you are expecting it to be.

## `InteractionService.ExecuteAsync()` always returns a successful result, how do i access the failed command execution results?

If you are using `RunMode.Async` you need to setup your post-execution pipeline around `CommandExecuted` events.

## How do I check if the executing user has * permission?

Refer to the [documentation about preconditions]

## How do I send the HTTP Response from inside the command modules.

Set the `RestResponseCallback` property of [InteractionServiceConfig] with a delegate for handling HTTP Responses and use
`RestInteractionModuleBase` to create your command modules. `RespondAsync()` and `DeferAsync()` methods of this module base will use the
`RestResponseCallback` to create interaction responses.

## Is there a cleaner way of creating parameter choices other than using `[Choice]`?

The default `enum` [TypeConverter] of the Interaction Service will
automatically register `enum`s as multiple choice options.

## How do I add an optional `enum` parameter but make the default value not visible to the user?

The default `enum` [TypeConverter] of the Interaction Service comes with `[Hide]` attribute that
can be used to prevent certain enum values from getting registered.

## How does the InteractionService determine the generic TypeConverter to use for a parameter type?

It compares the _target base type_ key of the
[TypeConverter] and chooses the one that sits highest on the inheritance hierarchy.

[TypeConverter]: xref:Discord.Interactions.TypeConverter
[Interactions FAQ]: xref: FAQ.Basics.Interactions
[InteractionServiceConfig]: xref:Discord.Interactions.InteractionServiceConfig
[documentation about preconditions]: xref: Guides.ChatCommands.Preconditions

+ 44
- 4
docs/faq/misc/glossary.md View File

@@ -26,11 +26,11 @@ channels, and are often referred to as "servers".
## Channel Types ## Channel Types


### Message Channels ### Message Channels
* A **Text Channel** ([ITextChannel]) is a message channel from a
Guild.
* A **Text Channel** ([ITextChannel]) is a message channel from a Guild.
* A **Thread Channel** ([IThreadChannel]) is a thread channel from a Guild.
* A **News Channel** ([INewsChannel]) (also goes as announcement channel) is a news channel from a Guild.
* A **DM Channel** ([IDMChannel]) is a message channel from a DM. * A **DM Channel** ([IDMChannel]) is a message channel from a DM.
* A **Group Channel** ([IGroupChannel]) is a message channel from a
Group.
* A **Group Channel** ([IGroupChannel]) is a message channel from a Group.
- This is rarely used due to the bot's inability to join groups. - This is rarely used due to the bot's inability to join groups.
* A **Private Channel** ([IPrivateChannel]) is a DM or a Group. * A **Private Channel** ([IPrivateChannel]) is a DM or a Group.
* A **Message Channel** ([IMessageChannel]) can be any of the above. * A **Message Channel** ([IMessageChannel]) can be any of the above.
@@ -39,11 +39,15 @@ Group.
* A **Guild Channel** ([IGuildChannel]) is a guild channel in a guild. * A **Guild Channel** ([IGuildChannel]) is a guild channel in a guild.
- This can be any channels that may exist in a guild. - This can be any channels that may exist in a guild.
* A **Voice Channel** ([IVoiceChannel]) is a voice channel in a guild. * A **Voice Channel** ([IVoiceChannel]) is a voice channel in a guild.
* A **Stage Channel** ([IStageChannel]) is a stage channel in a guild.
* A **Category Channel** ([ICategoryChannel]) (2.0+) is a category that * A **Category Channel** ([ICategoryChannel]) (2.0+) is a category that
holds one or more sub-channels. holds one or more sub-channels.
* A **Nested Channel** ([INestedChannel]) (2.0+) is a channel that can * A **Nested Channel** ([INestedChannel]) (2.0+) is a channel that can
exist under a category. exist under a category.


> [!NOTE]
> A Channel ([IChannel]) can be all types of channels.

[INestedChannel]: xref:Discord.INestedChannel [INestedChannel]: xref:Discord.INestedChannel
[IGuildChannel]: xref:Discord.IGuildChannel [IGuildChannel]: xref:Discord.IGuildChannel
[IMessageChannel]: xref:Discord.IMessageChannel [IMessageChannel]: xref:Discord.IMessageChannel
@@ -53,6 +57,33 @@ exist under a category.
[IPrivateChannel]: xref:Discord.IPrivateChannel [IPrivateChannel]: xref:Discord.IPrivateChannel
[IVoiceChannel]: xref:Discord.IVoiceChannel [IVoiceChannel]: xref:Discord.IVoiceChannel
[ICategoryChannel]: xref:Discord.ICategoryChannel [ICategoryChannel]: xref:Discord.ICategoryChannel
[IChannel]: xref:Discord.IChannel
[IThreadChannel]: xref:Discord.IThreadChannel
[IStageChannel]: xref:Discord.IStageChannel
[INewsChannel]: xref:Discord.INewsChannel

## Message Types

* An **User Message** ([IUserMessage]) is a message sent by a user.
* A **System Message** ([ISystemMessage]) is a message sent by Discord itself.
* A **Message** ([IMessage]) can be any of the above.

[IUserMessage]: xref:Discord.IUserMessage
[ISystemMessage]: xref:Discord.ISystemMessage
[IMessage]: xref:Discord.IMessage

## User Types

* A **Guild User** ([IGuildUser]) is a user available inside a guild.
* A **Group User** ([IGroupUser]) is a user available inside a group.
- This is rarely used due to the bot's inability to join groups.
* A **Self User** ([ISelfUser]) is the bot user the client is currently logged in as.
* An **User** ([IUser]) can be any of the above.

[IGuildUser]: xref:Discord.IGuildUser
[IGroupUser]: xref:Discord.IGroupUser
[ISelfUser]: xref:Discord.ISelfUser
[IUser]: xref:Discord.IUser


## Emoji Types ## Emoji Types


@@ -64,6 +95,15 @@ exist under a category.
[Emote]: xref:Discord.Emote [Emote]: xref:Discord.Emote
[Emoji]: xref:Discord.Emoji [Emoji]: xref:Discord.Emoji



## Sticker Types

* A **Sticker** ([ISticker]) is a standard Discord sticker.
* A **Custom Sticker ([ICustomSticker]) is a Guild-unique sticker.

[ISticker]: xref:Discord.ISticker
[ICustomSticker]: xref:Discord.ICustomSticker

## Activity Types ## Activity Types


* A **Game** ([Game]) refers to a user's game activity. * A **Game** ([Game]) refers to a user's game activity.


+ 2
- 2
docs/faq/misc/legacy.md View File

@@ -18,7 +18,7 @@ their breaking nature.


Visit the repo's [release tag] to see the latest public pre-release. Visit the repo's [release tag] to see the latest public pre-release.


[release tag]: https://github.com/RogueException/Discord.Net/releases
[release tag]: https://github.com/discord-net/Discord.Net/releases


## I came from an earlier version of Discord.Net 1.0, and DependencyMap doesn't seem to exist anymore in the later revision? What happened to it? ## I came from an earlier version of Discord.Net 1.0, and DependencyMap doesn't seem to exist anymore in the later revision? What happened to it?


@@ -26,4 +26,4 @@ The `DependencyMap` has been replaced with Microsoft's
[DependencyInjection] Abstractions. An example usage can be seen [DependencyInjection] Abstractions. An example usage can be seen
[here](https://github.com/foxbot/DiscordBotBase/blob/csharp/src/DiscordBot/Program.cs#L36). [here](https://github.com/foxbot/DiscordBotBase/blob/csharp/src/DiscordBot/Program.cs#L36).


[DependencyInjection]: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection
[DependencyInjection]: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection

+ 5
- 1
docs/faq/toc.yml View File

@@ -6,10 +6,14 @@
topicUid: FAQ.Basics.BasicOp topicUid: FAQ.Basics.BasicOp
- name: Client Basics - name: Client Basics
topicUid: FAQ.Basics.ClientBasics topicUid: FAQ.Basics.ClientBasics
- name: Interactions
topicUid: FAQ.Basics.InteractionBasics
- name: Commands - name: Commands
items: items:
- name: General
- name: String commands
topicUid: FAQ.Commands.General topicUid: FAQ.Commands.General
- name: Interaction commands
topicUid: FAQ.Commands.Interactions
- name: Dependency Injection - name: Dependency Injection
topicUid: FAQ.Commands.DI topicUid: FAQ.Commands.DI
- name: Glossary - name: Glossary


+ 2
- 3
docs/guides/concepts/entities.md View File

@@ -31,8 +31,7 @@ But that doesn't mean a message _can't_ come from a
retrieve information about a guild from a message entity, you will retrieve information about a guild from a message entity, you will
need to cast its channel object to a `SocketTextChannel`. need to cast its channel object to a `SocketTextChannel`.


You can find out various types of entities in the @FAQ.Misc.Glossary
page.
You can find out various types of entities in the [Glossary page.](xref:FAQ.Glossary)


## Navigation ## Navigation


@@ -63,4 +62,4 @@ a variant of the type that you need.


## Sample ## Sample


[!code-csharp[Entity Sample](samples/entities.cs)]
[!code-csharp[Entity Sample](samples/entities.cs)]

BIN
docs/guides/getting_started/images/nightlies-vs-note.png View File

Before After
Width: 1572  |  Height: 191  |  Size: 9.9 KiB

BIN
docs/guides/getting_started/images/nightlies-vs-step1.png View File

Before After
Width: 640  |  Height: 497  |  Size: 13 KiB

BIN
docs/guides/getting_started/images/nightlies-vs-step2.png View File

Before After
Width: 744  |  Height: 434  |  Size: 13 KiB

BIN
docs/guides/getting_started/images/nightlies-vs-step4.png View File

Before After
Width: 461  |  Height: 334  |  Size: 8.0 KiB

+ 36
- 34
docs/guides/getting_started/installing.md View File

@@ -11,9 +11,9 @@ may also compile this library yourself should you so desire.


## Supported Platforms ## Supported Platforms


Discord.Net targets [.NET Standard] both 1.3 and 2.0; this also means
that creating applications using the latest version of [.NET Core] is
the most recommended. If you are bound by Windows-specific APIs or
Discord.Net targets [.NET 6.0] and [.NET 5.0], but is also available on older versions, like [.NET Standard] and [.NET Core]; this still means
that creating applications using the latest version of .NET (6.0)
is most recommended. If you are bound by Windows-specific APIs or
other limitations, you may also consider targeting [.NET Framework] other limitations, you may also consider targeting [.NET Framework]
4.6.1 or higher. 4.6.1 or higher.


@@ -22,10 +22,12 @@ other limitations, you may also consider targeting [.NET Framework]
> notice. It is known to have issues with the library's WebSockets > notice. It is known to have issues with the library's WebSockets
> implementation and may crash the application upon startup. > implementation and may crash the application upon startup.


[Mono]: https://www.mono-project.com/
[.NET Standard]: https://docs.microsoft.com/en-us/dotnet/articles/standard/library
[.NET Core]: https://docs.microsoft.com/en-us/dotnet/articles/core/
[.NET Framework]: https://docs.microsoft.com/en-us/dotnet/framework/get-started/
[mono]: https://www.mono-project.com/
[.net 6.0]: https://docs.microsoft.com/en-us/dotnet/core/whats-new/dotnet-6
[.net 5.0]: https://docs.microsoft.com/en-us/dotnet/core/whats-new/dotnet-5
[.net standard]: https://docs.microsoft.com/en-us/dotnet/articles/standard/library
[.net core]: https://docs.microsoft.com/en-us/dotnet/articles/core/
[.net framework]: https://docs.microsoft.com/en-us/dotnet/framework/get-started/
[additional steps]: #installing-on-net-standard-11 [additional steps]: #installing-on-net-standard-11


## Installing with NuGet ## Installing with NuGet
@@ -37,37 +39,37 @@ Development builds of Discord.Net, as well as add-ons, will be
published to our [MyGet feed]. See published to our [MyGet feed]. See
@Guides.GettingStarted.Installation.Nightlies to learn more. @Guides.GettingStarted.Installation.Nightlies to learn more.


[official NuGet feed]: https://nuget.org
[MyGet feed]: https://www.myget.org/feed/Packages/discord-net
[official nuget feed]: https://nuget.org
[myget feed]: https://www.myget.org/feed/Packages/discord-net


### [Using Visual Studio](#tab/vs-install) ### [Using Visual Studio](#tab/vs-install)


1. Create a new solution for your bot 1. Create a new solution for your bot
2. In the Solution Explorer, find the "Dependencies" element under your 2. In the Solution Explorer, find the "Dependencies" element under your
bot's project
bot's project
3. Right click on "Dependencies", and select "Manage NuGet packages" 3. Right click on "Dependencies", and select "Manage NuGet packages"


![Step 3](images/install-vs-deps.png)
![Step 3](images/install-vs-deps.png)


4. In the "Browse" tab, search for `Discord.Net` 4. In the "Browse" tab, search for `Discord.Net`
5. Install the `Discord.Net` package 5. Install the `Discord.Net` package


![Step 5](images/install-vs-nuget.png)
![Step 5](images/install-vs-nuget.png)


### [Using JetBrains Rider](#tab/rider-install) ### [Using JetBrains Rider](#tab/rider-install)


1. Create a new solution for your bot 1. Create a new solution for your bot
2. Open the NuGet window (Tools > NuGet > Manage NuGet packages for Solution) 2. Open the NuGet window (Tools > NuGet > Manage NuGet packages for Solution)


![Step 2](images/install-rider-nuget-manager.png)
![Step 2](images/install-rider-nuget-manager.png)


3. In the "Packages" tab, search for `Discord.Net` 3. In the "Packages" tab, search for `Discord.Net`


![Step 3](images/install-rider-search.png)
![Step 3](images/install-rider-search.png)


4. Install by adding the package to your project 4. Install by adding the package to your project


![Step 4](images/install-rider-add.png)
![Step 4](images/install-rider-add.png)


### [Using Visual Studio Code](#tab/vs-code) ### [Using Visual Studio Code](#tab/vs-code)


@@ -82,7 +84,7 @@ published to our [MyGet feed]. See
2. Navigate to where your `*.csproj` is located 2. Navigate to where your `*.csproj` is located
3. Enter `dotnet add package Discord.Net` 3. Enter `dotnet add package Discord.Net`


***
---


## Compiling from Source ## Compiling from Source


@@ -90,15 +92,15 @@ In order to compile Discord.Net, you will need the following:


### Using Visual Studio ### Using Visual Studio


* [Visual Studio 2019](https://visualstudio.microsoft.com/)
* [.NET Core SDK]
- [Visual Studio 2019](https://visualstudio.microsoft.com/) or later.
- [.NET 5 SDK]


The .NET Core and Docker workload is required during Visual Studio
The .NET 5 workload is required during Visual Studio
installation. installation.


### Using Command Line ### Using Command Line


* [.NET Core SDK]
- [.NET 5 SDK]


## Additional Information ## Additional Information


@@ -117,28 +119,28 @@ by installing one or more custom packages as listed below.
1. Download the latest [.NET Core SDK]. 1. Download the latest [.NET Core SDK].
2. Create or move your existing project to use .NET Core. 2. Create or move your existing project to use .NET Core.
3. Modify your `<TargetFramework>` tag to at least `netcoreapp2.1`, or 3. Modify your `<TargetFramework>` tag to at least `netcoreapp2.1`, or
by adding the `--framework netcoreapp2.1` switch when building.
by adding the `--framework netcoreapp2.1` switch when building.


#### [Custom Packages](#tab/custom-pkg) #### [Custom Packages](#tab/custom-pkg)


1. Install or compile the following packages:
1. Install or compile the following packages:


* `Discord.Net.Providers.WS4Net`
* `Discord.Net.Providers.UDPClient` (Optional)
* This is _only_ required if your bot will be utilizing voice chat.
- `Discord.Net.Providers.WS4Net`
- `Discord.Net.Providers.UDPClient` (Optional)
- This is _only_ required if your bot will be utilizing voice chat.


2. Configure your [DiscordSocketClient] to use these custom providers
over the default ones.
2. Configure your [DiscordSocketClient] to use these custom providers
over the default ones.


* To do this, set the `WebSocketProvider` and the optional
`UdpSocketProvider` properties on the [DiscordSocketConfig] that you
are passing into your client.
* To do this, set the `WebSocketProvider` and the optional
`UdpSocketProvider` properties on the [DiscordSocketConfig] that you
are passing into your client.


[!code-csharp[Example](samples/netstd11.cs)] [!code-csharp[Example](samples/netstd11.cs)]


[DiscordSocketClient]: xref:Discord.WebSocket.DiscordSocketClient
[DiscordSocketConfig]: xref:Discord.WebSocket.DiscordSocketConfig
[discordsocketclient]: xref:Discord.WebSocket.DiscordSocketClient
[discordsocketconfig]: xref:Discord.WebSocket.DiscordSocketConfig


***
---


[.NET Core SDK]: https://dotnet.microsoft.com/download
[.net 5 sdk]: https://dotnet.microsoft.com/download

+ 30
- 0
docs/guides/getting_started/labs.md View File

@@ -0,0 +1,30 @@
---
uid: Guides.GettingStarted.Installation.Labs
title: Installing Labs builds
---

# Installing Discord.NET Labs

Discord.NET Labs is the experimental repository that introduces new features & chips away at all bugs until ready for merging into Discord.NET.
Are you looking to test or play with new features?

> [!IMPORTANT]
> It is very ill advised to use Discord.NET Labs in a production environment normally,
> considering it can include bugs that have not been discovered yet, as features are freshly added.
> However if approached correctly, will work as a pre-release to Discord.NET.
> Make sure to report any bugs at the Labs [repository] or on [Discord]

[Discord]: https://discord.gg/dnet
[repository]: https://github.com/Discord-Net-Labs/Discord.Net-Labs

## Installation:

[NuGet] - This only includes releases, on which features are ready to test.

> [!NOTE]
> Installing NuGet packages is covered fully at [Installing Discord NET](xref:Guides.GettingStarted.Installation)

[MyGet] - Available for current builds and unreleased features.

[NuGet]: https://www.nuget.org/packages/Discord.Net.Labs/
[MyGet]: https://www.myget.org/feed/Packages/discord-net-labs

+ 0
- 97
docs/guides/getting_started/nightlies.md View File

@@ -1,97 +0,0 @@
---
uid: Guides.GettingStarted.Installation.Nightlies
title: Installing Nightly Build
---

# Installing Discord.Net Nightly Build

Before Discord.Net pushes a new set of features into the stable
version, we use nightly builds to test the features with the
community for an extensive period of time. Each nightly build is
compiled by AppVeyor whenever a new commit is made and will be pushed
to our MyGet feed.

> [!IMPORTANT]
> Although nightlies are generally stable and have more features
> and bug fixes than the current stable build on NuGet, there
> will be breaking changes during the development or
> breaking bugs; these bugs are usually fixed as soon as they
> are discovered, but you should still be aware of that.

## Installing with MyGet (Recommended)

MyGet is typically used by many development teams to publish their
latest pre-release packages before the features are finalized and
pushed to NuGet.

The following is the feed link of Discord.Net,

* `https://www.myget.org/F/discord-net/api/v3/index.json`

Depending on which IDE you use, there are many different ways of
adding the feed to your package source.

### [Using Visual Studio](#tab/vs)

1. Go to `Tools` > `NuGet Package Manager` > `Package Manager Settings`

![VS](images/nightlies-vs-step1.png)

2. Go to `Package Sources`

![Package Sources](images/nightlies-vs-step2.png)

3. Click on the add icon
4. Fill in the desired name and source as shown below and hit `Update`

![Add Source](images/nightlies-vs-step4.png)

> [!NOTE]
> Remember to tick the `Include pre-release` checkbox to see the
> nightly builds!
> ![Checkbox](images/nightlies-vs-note.png)

### [Using dotnet CLI](#tab/cli)

1. Launch a terminal of your choice
2. Navigate to where your `*.csproj` is located
3. Type `dotnet add package Discord.Net --source https://www.myget.org/F/discord-net/api/v3/index.json`

### [Using Local NuGet.Config](#tab/local-nuget-config)

If you plan on deploying your bot or developing outside of Visual
Studio, you will need to create a local NuGet configuration file for
your project.

To do this, create a file named `NuGet.Config` alongside the root of
your application, where the project is located.

Paste the following snippets into this configuration file, adding any
additional feeds if necessary.

[!code[NuGet Configuration](samples/nuget.config)]

After which, you may install the packages by directly modifying the
project file and specifying a version, or by using
the [Package Manager Console](https://docs.microsoft.com/en-us/nuget/tools/powershell-reference)
(`Install-Package Discord.Net -IncludePrerelease`).

***

## Installing from AppVeyor Artifacts

As mentioned in the first paragraph, we utilize AppVeyor to perform
automated tests and publish the new build. During the publishing
process, we also upload the NuGet packages onto
AppVeyor's Artifact collection.

The latest build status can be found within our [AppVeyor project].

[AppVeyor project]: https://ci.appveyor.com/project/rogueexception/discord-net

1. In the project, you may find our latest build including the
aforementioned artifacts.
![Artifacts](images/appveyor-artifacts.png)
2. In the artifacts collection, you should see the latest packages
packed in `*.nupkg` form which you could download from and use.
![NuPkgs](images/appveyor-nupkg.png)

docs/guides/interactions/application-commands/context-menu-commands/creating-context-menu-commands.md → docs/guides/int_basics/application-commands/context-menu-commands/creating-context-menu-commands.md View File

@@ -16,9 +16,9 @@ Guild commands are specific to the guild you specify when making them. Guild com
- Your app can have a global and guild command with the same name - Your app can have a global and guild command with the same name
- Multiple apps can have commands with the same names - Multiple apps can have commands with the same names


**Note**: Apps can have a maximum of 5 global context menu commands, and an additional 5 guild-specific context menu commands per guild.
If you don't have the code for a bot ready yet please follow [this guide](https://docs.stillu.cc/guides/getting_started/first-bot.html).
[!IMPORTANT]
> Apps can have a maximum of 5 global context menu commands,
> and an additional 5 guild-specific context menu commands per guild.


## UserCommandBuilder ## UserCommandBuilder


@@ -40,7 +40,9 @@ The context menu message command builder will help you create message commands.
| WithName | Function | Sets the field name. | | WithName | Function | Sets the field name. |
| Build | Function | Builds the builder into the appropriate `MessageCommandProperties` class used to make Menu commands | | Build | Function | Builds the builder into the appropriate `MessageCommandProperties` class used to make Menu commands |


**Note**: Context Menu command names can be upper and lowercase, and use spaces.
> [!NOTE]
> Context Menu command names can be upper and lowercase, and use spaces.
> They cannot be registered pre-ready.


Let's use the user command builder to make a global and guild command. Let's use the user command builder to make a global and guild command.


@@ -102,4 +104,7 @@ public async Task Client_Ready()
``` ```


> [!NOTE] > [!NOTE]
> Application commands only need to be created once. They do _not_ have to be 'created' on every startup or connection. The example simple shows creating them in the ready event as it's simpler than creating normal bot commands to register application commands.
> Application commands only need to be created once. They do _not_ have to be
> 'created' on every startup or connection.
> The example simple shows creating them in the ready event
> as it's simpler than creating normal bot commands to register application commands.

docs/guides/interactions/application-commands/context-menu-commands/receiving-context-menu-command-events.md → docs/guides/int_basics/application-commands/context-menu-commands/receiving-context-menu-command-events.md View File


+ 51
- 0
docs/guides/int_basics/application-commands/intro.md View File

@@ -0,0 +1,51 @@
---
uid: Guides.SlashCommands.Intro
title: Introduction to slash commands
---


# Getting started with application commands.

This guide will show you how to use application commands.
If you have extra questions that aren't covered here you can come to our
[Discord](https://discord.com/invite/dvSfUTet3K) server and ask around there.

## What is an application command?

Application commands consist of three different types. Slash commands, context menu User commands and context menu Message commands.
Slash commands are made up of a name, description, and a block of options, which you can think of like arguments to a function.
The name and description help users find your command among many others, and the options validate user input as they fill out your command.
Message and User commands are only a name, to the user. So try to make the name descriptive.
They're accessed by right clicking (or long press, on mobile) a user or a message, respectively.

> [!IMPORTANT]
> Context menu commands are currently not supported on mobile.

All three varieties of application commands have both Global and Guild variants.
Your global commands are available in every guild that adds your application.
You can also make commands for a specific guild; they're only available in that guild.
The User and Message commands are more limited in quantity than the slash commands.
For specifics, check out their respective guide pages.

An Interaction is the message that your application receives when a user uses a command.
It includes the values that the user submitted, as well as some metadata about this particular instance of the command being used:
the guild_id,
channel_id,
member and other fields.
You can find all the values in our data models.

## Authorizing your bot for application commands

There is a new special OAuth2 scope for applications called `applications.commands`.
In order to make Application Commands work within a guild, the guild must authorize your application
with the `applications.commands` scope. The bot scope is not enough.

Head over to your discord applications OAuth2 screen and make sure to select the `application.commands` scope.

![OAuth2 scoping](slash-commands/images/oauth.png)

From there you can then use the link to add your bot to a server.

> [!NOTE]
> In order for users in your guild to use your slash commands, they need to have
> the "Use Application Commands" permission on the guild.

docs/guides/interactions/application-commands/slash-commands/08-bulk-overwrite-of-global-slash-commands.md → docs/guides/int_basics/application-commands/slash-commands/bulk-overwrite-of-global-slash-commands.md View File


docs/guides/interactions/application-commands/slash-commands/07-choice-slash-command.md → docs/guides/int_basics/application-commands/slash-commands/choice-slash-command.md View File


docs/guides/interactions/application-commands/slash-commands/02-creating-slash-commands.md → docs/guides/int_basics/application-commands/slash-commands/creating-slash-commands.md View File


docs/guides/interactions/application-commands/slash-commands/images/ephemeral1.png → docs/guides/int_basics/application-commands/slash-commands/images/ephemeral1.png View File


docs/guides/interactions/application-commands/slash-commands/images/feedback1.png → docs/guides/int_basics/application-commands/slash-commands/images/feedback1.png View File


docs/guides/interactions/application-commands/slash-commands/images/feedback2.png → docs/guides/int_basics/application-commands/slash-commands/images/feedback2.png View File


docs/guides/interactions/application-commands/slash-commands/images/listroles1.png → docs/guides/int_basics/application-commands/slash-commands/images/listroles1.png View File


docs/guides/interactions/application-commands/slash-commands/images/listroles2.png → docs/guides/int_basics/application-commands/slash-commands/images/listroles2.png View File


docs/guides/interactions/application-commands/slash-commands/images/oauth.png → docs/guides/int_basics/application-commands/slash-commands/images/oauth.png View File


docs/guides/interactions/application-commands/slash-commands/images/settings1.png → docs/guides/int_basics/application-commands/slash-commands/images/settings1.png View File


docs/guides/interactions/application-commands/slash-commands/images/settings2.png → docs/guides/int_basics/application-commands/slash-commands/images/settings2.png View File


docs/guides/interactions/application-commands/slash-commands/images/settings3.png → docs/guides/int_basics/application-commands/slash-commands/images/settings3.png View File


docs/guides/interactions/application-commands/slash-commands/images/slashcommand1.png → docs/guides/int_basics/application-commands/slash-commands/images/slashcommand1.png View File


docs/guides/interactions/application-commands/slash-commands/images/slashcommand2.png → docs/guides/int_basics/application-commands/slash-commands/images/slashcommand2.png View File


docs/guides/interactions/application-commands/slash-commands/04-parameters.md → docs/guides/int_basics/application-commands/slash-commands/parameters.md View File


docs/guides/interactions/application-commands/slash-commands/05-responding-ephemerally.md → docs/guides/int_basics/application-commands/slash-commands/responding-ephemerally.md View File


docs/guides/interactions/application-commands/slash-commands/03-responding-to-slash-commands.md → docs/guides/int_basics/application-commands/slash-commands/responding-to-slash-commands.md View File


docs/guides/interactions/application-commands/slash-commands/06-subcommands.md → docs/guides/int_basics/application-commands/slash-commands/subcommands.md View File


docs/guides/interactions/intro.md → docs/guides/int_basics/intro.md View File


docs/guides/interactions/message-components/05-advanced.md → docs/guides/int_basics/message-components/advanced.md View File


docs/guides/interactions/message-components/03-buttons-in-depth.md → docs/guides/int_basics/message-components/buttons-in-depth.md View File


docs/guides/interactions/message-components/images/image1.png → docs/guides/int_basics/message-components/images/image1.png View File


docs/guides/interactions/message-components/images/image2.png → docs/guides/int_basics/message-components/images/image2.png View File


docs/guides/interactions/message-components/images/image3.png → docs/guides/int_basics/message-components/images/image3.png View File


docs/guides/interactions/message-components/images/image4.png → docs/guides/int_basics/message-components/images/image4.png View File


docs/guides/interactions/message-components/images/image5.png → docs/guides/int_basics/message-components/images/image5.png View File


docs/guides/interactions/message-components/images/image6.png → docs/guides/int_basics/message-components/images/image6.png View File


docs/guides/interactions/message-components/01-getting-started.md → docs/guides/int_basics/message-components/intro.md View File

@@ -1,5 +1,5 @@
--- ---
uid: Guides.MessageComponents.GettingStarted
uid: Guides.MessageComponents.Intro
title: Getting Started with Components title: Getting Started with Components
--- ---



docs/guides/interactions/message-components/02-responding-to-buttons.md → docs/guides/int_basics/message-components/responding-to-buttons.md View File


docs/guides/interactions/message-components/04-select-menus.md → docs/guides/int_basics/message-components/select-menus.md View File


+ 47
- 0
docs/guides/int_framework/autocompletion.md View File

@@ -0,0 +1,47 @@
---
uid: Guides.IntFw.AutoCompletion
title: Command Autocompletion
---

# AutocompleteHandlers

[Autocompleters] provide a similar pattern to TypeConverters.
[Autocompleters] are cached, singleton services and they are used by the
Interaction Service to handle Autocomplete Interations targeted to a specific Slash Command parameter.

To start using AutocompleteHandlers, use the `[AutocompleteAttribute(Type type)]` overload of the [AutocompleteAttribute].
This will dynamically link the parameter to the [AutocompleteHandler] type.

AutocompleteHandlers raise the `AutocompleteHandlerExecuted` event on execution. This event can be also used to create a post-execution logic, just like the `*CommandExecuted` events.

## Creating AutocompleteHandlers

A valid AutocompleteHandlers must inherit [AutocompleteHandler] base type and implement all of its abstract methods.

### GenerateSuggestionsAsync()

The Interactions Service uses this method to generate a response of an Autocomplete Interaction.
This method should return `AutocompletionResult.FromSuccess(IEnumerable<AutocompleteResult>)` to
display parameter suggestions to the user. If there are no suggestions to be presented to the user, you have two results:

1. Returning the parameterless `AutocompletionResult.FromSuccess()` will display a "No options match your search." message to the user.
2. Returning `AutocompleteResult.FromError()` will make the Interaction Service **not** respond to the interaction,
consequently displaying the user a "Loading options failed." message. `AutocompletionResult.FromError()` is solely used for error handling purposes. Discord currently doesn't allow
you to display custom error messages. This result type will be directly returned to the `AutocompleteHandlerExecuted` method.

## Resolving AutocompleteHandler Dependencies

AutocompleteHandler dependencies are resolved using the same dependency injection
pattern as the Interaction Modules.
Property injection and constructor injection are both valid ways to get service dependencies.

Because [AutocompleterHandlers] are constructed at service startup,
class dependencies are resolved only once.

> [!NOTE]
> If you need to access per-request dependencies you can use the
> IServiceProvider parameter of the `GenerateSuggestionsAsync()` method.

[AutoCompleteHandlers]: xref:Discord.Interactions.AutocompleteHandler
[AutoCompleteHandler]: xref:Discord.Interactions.AutocompleteHandler
[AutoCompleteAttribute]:

+ 13
- 0
docs/guides/int_framework/dependency-injection.md View File

@@ -0,0 +1,13 @@
---
uid: Guides.IntFw.DI
title: Dependency Injection
---

# Dependency Injection

Dependency injection in the Interaction Service is mostly based on that of the Text-based command service,
for which further information is found [here](xref:Guides.TextCommands.DI).

> [!NOTE]
> The 2 are nearly identical, except for one detail:
> [Resolving Module Dependencies](xref:Guides.IntFw.Intro#resolving-module-dependencies)

+ 353
- 0
docs/guides/int_framework/intro.md View File

@@ -0,0 +1,353 @@
---
uid: Guides.IntFw.Intro
title: Introduction to the Interaction Service
---

# Getting Started

The Interaction Service provides an attribute based framework for creating Discord Interaction handlers.

To start using the Interaction Service, you need to create a service instance.
Optionally you can provide the [InteractionService] constructor with a
[InteractionServiceConfig] to change the services behaviour to suit your needs.

```csharp
...
// _client here is DiscordSocketClient.
// A different approach to passing in a restclient is also possible.
var _interactionService = new InteractionService(_client.Rest);

...
```

## Modules

Attribute based Interaction handlers must be defined within a command module class.
Command modules are responsible for executing the Interaction handlers and providing them with the necessary execution info and helper functions.

Command modules are transient objects.
A new module instance is created before a command execution starts then it will be disposed right after the method returns.

Every module class must:

- be public
- inherit [InteractionModuleBase]

Optionally you can override the included :

- OnModuleBuilding (executed after the module is built)
- BeforeExecute (executed before a command execution starts)
- AfterExecute (executed after a command execution concludes)

methods to configure the modules behaviour.

Every command module exposes a set of helper methods, namely:

- `RespondAsync()` => Respond to the interaction
- `FollowupAsync()` => Create a followup message for an interaction
- `ReplyAsync()` => Send a message to the origin channel of the interaction
- `DeleteOriginalResponseAsync()` => Delete the original interaction response

## Commands

Valid **Interaction Commands** must comply with the following requirements:

| | return type | max parameter count | allowed parameter types | attribute |
|-------------------------------|------------------------------|---------------------|-------------------------------|--------------------------|
|[Slash Command](#slash-commands)| `Task`/`Task<RuntimeResult>` | 25 | any* | `[SlashCommand]` |
|[User Command](#user-commands) | `Task`/`Task<RuntimeResult>` | 1 | Implementations of `IUser` | `[UserCommand]` |
|[Message Command](#message-commands)| `Task`/`Task<RuntimeResult>` | 1 | Implementations of `IMessage` | `[MessageCommand]` |
|[Component Interaction Command](#component-interaction-commands)| `Task`/`Task<RuntimeResult>` | inf | `string` or `string[]` | `[ComponentInteraction]` |
|[Autocomplete Command](#autocomplete-commands)| `Task`/`Task<RuntimeResult>` | - | - | `[AutocompleteCommand]`|

> [!NOTE]
> a `TypeConverter` that is capable of parsing type in question must be registered to the [InteractionService] instance.
> You should avoid using long running code in your command module.
> Depending on your setup, long running code may block the Gateway thread of your bot, interrupting its connection to Discord.

## Slash Commands

Slash Commands are created using the [SlashCommandAttribute].
Every Slash Command must declare a name and a description.
You can check Discords **Application Command Naming Guidelines**
[here](https://discord.com/developers/docs/interactions/application-commands#application-command-object-application-command-naming).

[!code-csharp[Slash Command](samples/intro/slashcommand.cs)]

### Parameters

Slash Commands can have up to 25 method parameters. You must name your parameters in accordance with
[Discords Naming Guidelines](https://discord.com/developers/docs/interactions/application-commands#application-command-object-application-command-naming).
[InteractionService] also features a pascal casing seperator for formatting parameter names with
pascal casing into Discord compliant parameter names('parameterName' => 'parameter-name').
By default, your methods can feature the following parameter types:

- Implementations of [IUser]
- Implementations of [IChannel]
- Implementations of [IRole]
- Implementations of [IMentionable]
- `string`
- `float`, `double`, `decimal`
- `bool`
- `char`
- `sbyte`, `byte`
- `int16`, `int32`, `int64`
- `uint16`, `uint32`, `uint64`
- `enum` (Values are registered as multiple choice options and are enforced by Discord. Use `[HideAttribute]` on enum values to prevent them from getting registered.)
- `DateTime`
- `TimeSpan`

---

**You can use more specialized implementations of [IChannel] to restrict the allowed channel types for a channel type option.*
| interface | Channel Type |
|---------------------|-------------------------------|
| `IStageChannel` | Stage Channels |
| `IVoiceChannel` | Voice Channels |
| `IDMChannel` | DM Channels |
| `IGroupChannel` | Group Channels |
| `ICategory Channel` | Category Channels |
| `INewsChannel` | News Channels |
| `IThreadChannel` | Public, Private, News Threads |
| `ITextChannel` | Text Channels |

---

#### Optional Parameters

Parameters with default values (ie. `int count = 0`) will be displayed as optional parameters on Discord Client.

#### Parameter Summary

By using the [SummaryAttribute] you can customize the displayed name and description of a parameter

[!code-csharp[Summary Attribute](samples/intro/summaryattribute.cs)]

#### Parameter Choices

[ChoiceAttribute] can be used to add choices to a parameter.

[!code-csharp[Choice Attribute](samples/intro/groupattribute.cs)]

This Slash Command will be displayed exactly the same as the previous example.

#### Channel Types

Channel types for an [IChannel] parameter can also be restricted using the [ChannelTypesAttribute].

[!code-csharp[Channel Attribute](samples/intro/channelattribute.cs)]

In this case, user can only input Stage Channels and Text Channels to this parameter.

#### Min/Max Value

You can specify the permitted max/min value for a number type parameter using the [MaxValueAttribute] and [MinValueAttribute].

## User Commands

A valid User Command must have the following structure:

[!code-csharp[User Command](samples/intro/usercommand.cs)]

> [!WARNING]
> User commands can only have one parameter and its type must be an implementation of [IUser].

## Message Commands

A valid Message Command must have the following structure:

[!code-csharp[Message Command](samples/intro/messagecommand.cs)]

> [!WARNING]
> Message commands can only have one parameter and its type must be an implementation of [IMessage].

## Component Interaction Commands

Component Interaction Commands are used to handle interactions that originate from **Discord Message Component**s.
This pattern is particularly useful if you will be reusing a set a **Custom ID**s.

Component Interaction Commands support wild card matching,
by default `*` character can be used to create a wild card pattern.
Interaction Service will use lazy matching to capture the words corresponding to the wild card character.
And the captured words will be passed on to the command method in the same order they were captured.

[!code-csharp[Button](samples/intro/button.cs)]

You may use as many wild card characters as you want.

> [!NOTE]
> If Interaction Service recieves a component interaction with **player:play,rickroll** custom id,
> `op` will be *play* and `name` will be *rickroll*

## Select Menus

Unlike button interactions, select menu interactions also contain the values of the selected menu items.
In this case, you should structure your method to accept a string array.

[!code-csharp[Dropdown](samples/intro/dropdown.cs)]

> [!NOTE]
> Wildcards may also be used to match a select menu ID,
> though keep in mind that the array containing the select menu values should be the last parameter.

## Autocomplete Commands

Autocomplete commands must be parameterless methods. A valid Autocomplete command must have the following structure:

[!code-csharp[Autocomplete Command](samples/intro/autocomplete.cs)]

Alternatively, you can use the [AutocompleteHandlers] to simplify this workflow.

## Interaction Context

Every command module provides its commands with an execution context.
This context property includes general information about the underlying interaction that triggered the command execution.
The base command context.

You can design your modules to work with different implementation types of [IInteractionContext].
To achieve this, make sure your module classes inherit from the generic variant of the [InteractionModuleBase].

> [!NOTE]
> Context type must be consistent throughout the project, or you will run into issues during runtime.

The [InteractionService] ships with 4 different kinds of [InteractionContext]:

1. [InteractionContext]]: A bare-bones execution context consisting of only implementation neutral interfaces
2. [SocketInteractionContext]: An execution context for use with [DiscordSocketClient]. Socket entities are exposed in this context without the need of casting them.
3. [ShardedInteractionContext]: [DiscordShardedClient] variant of the [SocketInteractionContext]
4. [RestInteractionContext]: An execution context designed to be used with a [DiscordRestClient] and webhook based interactions pattern

You can create custom Interaction Contexts by implementing the [IInteractionContext] interface.

One problem with using the concrete type InteractionContexts is that you cannot access the information that is specific to different interaction types without casting. Concrete type interaction contexts are great for creating shared interaction modules but you can also use the generic variants of the built-in interaction contexts to create interaction specific interaction modules.

> [!INFO]
> Message component interactions have access to a special method called `UpdateAsync()` to update the body of the method the interaction originated from.
> Normally this wouldn't be accessable without casting the `Context.Interaction`.

[!code-csharp[Context Example](samples/intro/context.cs)]

## Loading Modules

[InteractionService] can automatically discover and load modules that inherit [InteractionModuleBase] from an `Assembly`.
Call `InteractionService.AddModulesAsync()` to use this functionality.

> [!NOTE]
> You can also manually add Interaction modules using the `InteractionService.AddModuleAsync()`
> method by providing the module type you want to load.

## Resolving Module Dependencies

Module dependencies are resolved using the Constructor Injection and Property Injection patterns.
Meaning, the constructor parameters and public settable properties of a module will be assigned using the `IServiceProvider`.
For more information on dependency injection, read the [DependencyInjection] guides.

> [!NOTE]
> On every command execution, module dependencies are resolved using a new service scope which allows you to utilize scoped service instances, just like in Asp.Net.
> Including the precondition checks, every module method is executed using the same service scope and service scopes are disposed right after the `AfterExecute` method returns.

## Module Groups

Module groups allow you to create sub-commands and sub-commands groups.
By nesting commands inside a module that is tagged with [GroupAttribute] you can create prefixed commands.

> [!WARNING]
> Although creating nested module stuctures are allowed,
> you are not permitted to use more than 2 [GroupAttribute]'s in module hierarchy.

## Executing Commands

Any of the following socket events can be used to execute commands:

- [InteractionCreated]
- [ButtonExecuted]
- [SelectMenuExecuted]
- [AutocompleteExecuted]
- [UserCommandExecuted]
- [MessageCommandExecuted]

Commands can be either executed on the gateway thread or on a seperate thread from the thread pool. This behaviour can be configured by changing the *RunMode* property of `InteractionServiceConfig` or by setting the *runMode* parameter of a command attribute.

You can also configure the way [InteractionService] executes the commands.
By default, commands are executed using `ConstructorInfo.Invoke()` to create module instances and
`MethodInfo.Invoke()` method for executing the method bodies.
By setting, `InteractionServiceConfig.UseCompiledLambda` to `true`, you can make [InteractionService] create module instances and execute commands using
*Compiled Lambda* expressions. This cuts down on command execution time but it might add some memory overhead.

Time it takes to create a module instance and execute a `Task.Delay(0)` method using the Reflection methods compared to Compiled Lambda expressions:

| Method | Mean | Error | StdDev |
|----------------- |----------:|---------:|---------:|
| ReflectionInvoke | 225.93 ns | 4.522 ns | 7.040 ns |
| CompiledLambda | 48.79 ns | 0.981 ns | 1.276 ns |

## Registering Commands to Discord

Application commands loaded to the Interaction Service can be registered to Discord using a number of different methods.
In most cases `RegisterCommandsGloballyAsync()` and `RegisterCommandsToGuildAsync()` are the methods to use.
Command registration methods can only be used after the gateway client is ready or the rest client is logged in.

[!code-csharp[Registering Commands Example](samples/intro/registering.cs)]

Methods like `AddModulesToGuildAsync()`, `AddCommandsToGuildAsync()`, `AddModulesGloballyAsync()` and `AddCommandsGloballyAsync()`
can be used to register cherry picked modules or commands to global/guild scopes.

> [!NOTE]
> In debug environment, since Global commands can take up to 1 hour to register/update,
> it is adviced to register your commands to a test guild for your changes to take effect immediately.
> You can use preprocessor directives to create a simple logic for registering commands as seen above

## Interaction Utility

Interaction Service ships with a static `InteractionUtiliy`
class which contains some helper methods to asynchronously waiting for Discord Interactions.
For instance, `WaitForInteractionAsync()` method allows you to wait for an Interaction for a given amount of time.
This method returns the first encountered Interaction that satisfies the provided predicate.

> [!WARNING]
> If you are running the Interaction Service on `RunMode.Sync` you should avoid using this method in your commands,
> as it will block the gateway thread and interrupt your bots connection.

## Webhook Based Interactions

Instead of using the gateway to recieve Discord Interactions, Discord allows you to recieve Interaction events over Webhooks.
Interaction Service also supports this Interaction type but to be able to
respond to the Interactions within your command modules you need to perform the following:

- Make your modules inherit `RestInteractionModuleBase`
- Set the `ResponseCallback` property of `InteractionServiceConfig` so that the `ResponseCallback`
delegate can be used to create HTTP responses from a deserialized json object string.
- Use the interaction endpoints of the module base instead of the interaction object (ie. `RespondAsync()`, `FollowupAsync()`...).

[AutocompleteHandlers]: xref:Guides.IntFw.AutoCompletion
[DependencyInjection]: xref:Guides.TextCommands.DI

[GroupAttribute]: xref:Discord.Interactions.GroupAttribute
[InteractionService]: xref:Discord.Interactions.InteractionService
[InteractionServiceConfig]: xref:Discord.Interactions.InteractionServiceConfig
[InteractionModuleBase]: xref:Discord.Interactions.InteractionModuleBase
[SlashCommandAttribute]: xref:Discord.Interactions.SlashCommandAttribute
[InteractionCreated]: xref:Discord.WebSocket.BaseSocketClient
[ButtonExecuted]: xref:Discord.WebSocket.BaseSocketClient
[SelectMenuExecuted]: xref:Discord.WebSocket.BaseSocketClient
[AutocompleteExecuted]: xref:Discord.WebSocket.BaseSocketClient
[UserCommandExecuted]: xref:Discord.WebSocket.BaseSocketClient
[MessageCommandExecuted]: xref:Discord.WebSocket.BaseSocketClient
[DiscordSocketClient]: xref:Discord.WebSocket.DiscordSocketClient
[DiscordRestClient]: xref:Discord.Rest.DiscordRestClient
[SocketInteractionContext]: xref:Discord.Interactions.SocketInteractionContext
[ShardedInteractionContext]: xref:Discord.Interactions.ShardedInteractionContext
[InteractionContext]: xref:Discord.Interactions.InteractionContext
[IInteractionContect]: xref:Discord.Interactions.IInteractionContext
[RestInteractionContext]: xref:Discord.Rest.RestInteractionContext
[SummaryAttribute]: xref:Discord.Interactions.SummaryAttribute
[ChoiceAttribute]: xref:Discord.Interactions.ChoiceAttribute
[ChannelTypesAttribute]: xref:Discord.Interactions.ChannelTypesAttribute
[MaxValueAttribute]: xref:Discord.Interactions.MaxValueAttribute
[MinValueAttribute]: xref:Discord.Interactions.MinValueAttribute

[IChannel]: xref:Discord.IChannel
[IRole]: xref:Discord.IRole
[IUser]: xref:Discord.IUser
[IMessage]: xref:Discord.IMessage
[IMentionable]: xref:Discord.IMentionable

+ 69
- 0
docs/guides/int_framework/post-execution.md View File

@@ -0,0 +1,69 @@
---
uid: Guides.IntFw.PostExecution
title: Post-Command execution
---

# Post-Execution Logic

Interaction Service uses [IResult] to provide information about the state of command execution.
These can be used to log internal exceptions or provide some insight to the command user.

If you are running your commands using `RunMode.Sync` these command results can be retrieved from
the return value of [InteractionService.ExecuteCommandAsync] method or by
registering delegates to Interaction Service events.

If you are using the `RunMode.Async` to run your commands,
you must use the Interaction Service events to get the execution results. When using `RunMode.Async`,
[InteractionService.ExecuteCommandAsync] will always return a successful result.

[InteractionService.ExecuteCommandAsync]: xref:Discord.Interactions.InteractionService.ExecuteCommandAsync*

## Results

Interaction Result come in a handful of different flavours:

1. [AutocompletionResult]: returned by Autocompleters
2. [ExecuteResult]: contains the result of method body execution process
3. [PreconditionGroupResult]: returned by Precondition groups
4. [PreconditionResult]: returned by preconditions
5. [RuntimeResult]: a user implementable result for returning user defined results
6. [SearchResult]: returned by command lookup map
7. [TypeConverterResult]: returned by TypeConverters

> [!NOTE]
> You can either use the [IResult.Error] property of an Interaction result or create type check for the
> afformentioned result types to branch out your post-execution logic to handle different situations.


[AutocompletionResult]: xref:Discord.AutocompleteResult
[ExecuteResult]: xref:Discord.Interactions.ExecuteResult
[PreconditionGroupResult]: xref:Discord.Interactions.PreconditionGroupResult
[PreconditionResult]: xref:Discord.Interactions.PreconditionResult
[SearchResult]: xref:Discord.Interactions.SearchResult`1
[TypeConverterResult]: xref:Discord.Interactions.TypeConverterResult
[IResult.Error]: xref:Discord.Interactions.IResult.Error*

## CommandExecuted Events

Every time a command gets executed, Interaction Service raises a `CommandExecuted` event.
These events can be used to create a post-execution pipeline.

[!code-csharp[Error Review](samples/postexecution/error_review.cs)

## Log Event

InteractionService regularly outputs information about the occuring events to keep the developer informed.

## Runtime Result

Interaction commands allow you to return `Task<RuntimeResult>` to pass on additional information about the command execution
process back to your post-execution logic.

Custom [RuntimeResult] classes can be created by inheriting the base [RuntimeResult] class.

If command execution process reaches the method body of the command and no exceptions are thrown during
the execution of the method body, [RuntimeResult] returned by your command will be accessible by casting/type-checking the
[IResult] parameter of the `CommandExecuted` event delegate.

[RuntimeResult]: xref:Discord.Interactions.RuntimeResult
[IResult]: xref:Discord.Interactions.IResult

+ 77
- 0
docs/guides/int_framework/preconditions.md View File

@@ -0,0 +1,77 @@
---
uid: Guides.IntFw.Preconditions
title: Preconditions
---

# Preconditions

Precondition logic is the same as it is for Text-based commands.
A list of attributes and usage is still given for people who are new to both.

There are two types of Preconditions you can use:

* [PreconditionAttribute] can be applied to Modules, Groups, or Commands.
* [ParameterPreconditionAttribute] can be applied to Parameters.

You may visit their respective API documentation to find out more.

[PreconditionAttribute]: xref:Discord.Interactions.PreconditionAttribute
[ParameterPreconditionAttribute]: xref:Discord.Interactions.ParameterPreconditionAttribute

## Bundled Preconditions

@Discord.Interactions ships with several bundled Preconditions for you
to use.

* @Discord.Interactions.RequireContextAttribute
* @Discord.Interactions.RequireOwnerAttribute
* @Discord.Interactions.RequireBotPermissionAttribute
* @Discord.Interactions.RequireUserPermissionAttribute
* @Discord.Interactions.RequireNsfwAttribute
* @Discord.Interactions.RequireRoleAttribute

## Using Preconditions

To use a precondition, simply apply any valid precondition candidate to
a command method signature as an attribute.

[!code-csharp[Precondition usage](samples/preconditions/precondition_usage.cs)]

## ORing Preconditions

When writing commands, you may want to allow some of them to be
executed when only some of the precondition checks are passed.

This is where the [Group] property of a precondition attribute comes in
handy. By assigning two or more preconditions to a group, the command
system will allow the command to be executed when one of the
precondition passes.

### Example - ORing Preconditions

[!code-csharp[OR Precondition](samples/preconditions/group_precondition.cs)]

[Group]: xref:Discord.Commands.PreconditionAttribute.Group

## Custom Preconditions

To write your own Precondition, create a new class that inherits from
either [PreconditionAttribute] or [ParameterPreconditionAttribute]
depending on your use.

In order for your Precondition to function, you will need to override
the [CheckPermissionsAsync] method.

If the context meets the required parameters, return
[PreconditionResult.FromSuccess], otherwise return
[PreconditionResult.FromError] and include an error message if
necessary.

> [!NOTE]
> Visual Studio can help you implement missing members
> from the abstract class by using the "Implement Abstract Class"
> IntelliSense hint.

[CheckPermissionsAsync]: xref:Discord.Commands.PreconditionAttribute.CheckPermissionsAsync*
[PreconditionResult.FromSuccess]: xref:Discord.Commands.PreconditionResult.FromSuccess*
[PreconditionResult.FromError]: xref:Discord.Commands.PreconditionResult.FromError*

+ 9
- 0
docs/guides/int_framework/samples/intro/autocomplete.cs View File

@@ -0,0 +1,9 @@
[AutocompleteCommand("parameter_name", "command_name")]
public async Task Autocomplete()
{
IEnumerable<AutocompleteResult> results;

...

await (Context.Interaction as SocketAutocompleteInteraction).RespondAsync(results);
}

+ 5
- 0
docs/guides/int_framework/samples/intro/button.cs View File

@@ -0,0 +1,5 @@
[ComponentInteraction("player:*,*")]
public async Task Play(string op, string name)
{
...
}

+ 5
- 0
docs/guides/int_framework/samples/intro/channelattribute.cs View File

@@ -0,0 +1,5 @@
[SlashCommand("name", "Description")]
public async Task Command([ChannelTypes(ChannelType.Stage, ChannelType.Text)] IChannel channel)
{
...
}

+ 14
- 0
docs/guides/int_framework/samples/intro/context.cs View File

@@ -0,0 +1,14 @@
discordClient.ButtonExecuted += async (interaction) =>
{
var ctx = new SocketInteractionContext<SocketMessageComponent>(discordClient, interaction);
await _interactionService.ExecuteAsync(ctx, serviceProvider);
};

public class MessageComponentModule : InteractionModuleBase<SocketInteractionContext<SocketMessageComponent>>
{
[ComponentInteraction("custom_id")]
public async Command()
{
Context.Interaction.UpdateAsync(...);
}
}

+ 11
- 0
docs/guides/int_framework/samples/intro/dropdown.cs View File

@@ -0,0 +1,11 @@
[ComponentInteraction("role_selection")]
public async Task RoleSelection(string[] selectedRoles)
{
...
}

[ComponentInteraction("role_selection_*")]
public async Task RoleSelection(string id, string[] selectedRoles)
{
...
}

+ 21
- 0
docs/guides/int_framework/samples/intro/groupattribute.cs View File

@@ -0,0 +1,21 @@
[SlashCommand("blep", "Send a random adorable animal photo")]
public async Task Blep([Choice("Dog", "dog"), Choice("Cat", "cat"), Choice("Penguin", "penguin")] string animal)
{
...
}

// In most cases, you can use an enum to replace the seperate choice attributes in a command.

public enum Animal
{
Cat,
Dog,
Penguin
}

[SlashCommand("blep", "Send a random adorable animal photo")]
public async Task Blep(Animal animal)
{
...
}
```

+ 5
- 0
docs/guides/int_framework/samples/intro/messagecommand.cs View File

@@ -0,0 +1,5 @@
[MessageCommand("Bookmark")]
public async Task Bookmark(IMessage msg)
{
...
}

+ 5
- 0
docs/guides/int_framework/samples/intro/registering.cs View File

@@ -0,0 +1,5 @@
#if DEBUG
await interactionService.RegisterCommandsToGuildAsync(<test_guild_id>);
#else
await interactionService.RegisterCommandsGloballyAsync();
#endif

+ 5
- 0
docs/guides/int_framework/samples/intro/slashcommand.cs View File

@@ -0,0 +1,5 @@
[SlashCommand("echo", "Echo an input")]
public async Task Echo(string input)
{
await RespondAsync(input);
}

+ 1
- 0
docs/guides/int_framework/samples/intro/summaryattribute.cs View File

@@ -0,0 +1 @@
[Summary(description: "this is a parameter description")] string input

+ 5
- 0
docs/guides/int_framework/samples/intro/usercommand.cs View File

@@ -0,0 +1,5 @@
[UserCommand("Say Hello")]
public async Task SayHello(IUser user)
{
...
}

+ 28
- 0
docs/guides/int_framework/samples/postexecution/error_review.cs View File

@@ -0,0 +1,28 @@
interactionService.SlashCommandExecuted += SlashCommandExecuted;

async Task SlashCommandExecuted(SlashCommandInfo arg1, Discord.IInteractionContext arg2, IResult arg3)
{
if (!arg3.IsSuccess)
{
switch (arg3.Error)
{
case InteractionCommandError.UnmetPrecondition:
await arg2.Interaction.RespondAsync($"Unmet Precondition: {arg3.ErrorReason}");
break;
case InteractionCommandError.UnknownCommand:
await arg2.Interaction.RespondAsync("Unknown command");
break;
case InteractionCommandError.BadArgs:
await arg2.Interaction.RespondAsync("Invalid number or arguments");
break;
case InteractionCommandError.Exception:
await arg2.Interaction.RespondAsync("Command exception:{arg3.ErrorReason}");
break;
case InteractionCommandError.Unsuccessful:
await arg2.Interaction.RespondAsync("Command could not be executed");
break;
default:
break;
}
}
}

docs/guides/commands/samples/preconditions/group_precondition.cs → docs/guides/int_framework/samples/preconditions/group_precondition.cs View File


+ 3
- 0
docs/guides/int_framework/samples/preconditions/precondition_usage.cs View File

@@ -0,0 +1,3 @@
[RequireOwner]
[SlashCommand("hi")]
public Task SayHiAsync() => RespondAsync("hello owner!");

+ 30
- 0
docs/guides/int_framework/samples/typeconverters/enum_converter.cs View File

@@ -0,0 +1,30 @@
internal sealed class EnumConverter<T> : TypeConverter<T> where T : struct, Enum
{
public override ApplicationCommandOptionType GetDiscordType() => ApplicationCommandOptionType.String;

public override Task<TypeConverterResult> ReadAsync(IInteractionCommandContext context, SocketSlashCommandDataOption option, IServiceProvider services)
{
if (Enum.TryParse<T>((string)option.Value, out var result))
return Task.FromResult(TypeConverterResult.FromSuccess(result));
else
return Task.FromResult(TypeConverterResult.FromError(InteractionCommandError.ConvertFailed, $"Value {option.Value} cannot be converted to {nameof(T)}"));
}

public override void Write(ApplicationCommandOptionProperties properties, IParameterInfo parameterInfo)
{
var names = Enum.GetNames(typeof(T));
if (names.Length <= 25)
{
var choices = new List<ApplicationCommandOptionChoiceProperties>();

foreach (var name in names)
choices.Add(new ApplicationCommandOptionChoiceProperties
{
Name = name,
Value = name
});

properties.Choices = choices;
}
}
}

+ 118
- 0
docs/guides/int_framework/typeconverters.md View File

@@ -0,0 +1,118 @@
---
uid: Guides.IntFw.TypeConverters
title: Parameter Type Converters
---

# TypeConverters

[TypeConverters] are responsible for registering command parameters to Discord and parsing the user inputs into method parameters.

By default, TypeConverters for the following types are provided with @Discord.Interactions library.

- Implementations of [IUser]
- Implementations of [IChannel]
- Implementations of [IRole]
- Implementations of [IMentionable]
- `string`
- `float`, `double`, `decimal`
- `bool`
- `char`
- `sbyte`, `byte`
- `int16`, `int32`, `int64`
- `uint16`, `uint32`, `uint64`
- `enum`
- `DateTime`
- `TimeSpan`

## Creating TypeConverters

Depending on your needs, there are two types of TypeConverters you can create:

- Concrete type
- Generic type

A valid converter must inherit [TypeConverter] base type. And override the abstract base methods.

### CanConvertTo() Method

This method is used by Interaction Service to search for alternative Type Converters.

Interaction Services determines the most suitable [TypeConverter] for a parameter type in the following order:

1. It searches for a [TypeConverter] that is registered to specifically target that parameter type
2. It searches for a [TypeConverter] that returns `true` when its `CanConvertTo()` method is invoked for thaty parameter type.
3. It searches for a generic `TypeConverter<T>` with a matching type constraint. If there are more multiple matches,
the one whose type constraint is the most specialized will be chosen.

> [!NOTE}
> Alternatively, you can use the generic variant (`TypeConverter<T>`) of the
> [TypeConverter] base class which implements the following method body for `CanConvertTo()` method

```csharp
public sealed override bool CanConvertTo (Type type) =>
typeof(T).IsAssignableFrom(type);
```

### GetDiscordType() Method

This method is used by [InteractionService] to determine the
[Discord Application Command Option type](https://discord.com/developers/docs/interactions/application-commands#application-command-object-application-command-option-type)
of a parameter type.

### ReadAsync() Method

This method is used by [InteractionService] to parse the user input.
This method should return @Discord.Interactions.TypeConverterResult.FromSuccess* if the parsing operation is successful,
otherwise it should return @Discord.Interactions.TypeConverterResult.FromError* .
The inner logic of this method is totally up to you,
however you should avoid using long running code.

### Write() Method

This method is used to configure the **Discord Application Command Option** before it gets registered to Discord.
Command Option is configured by modifying the `ApplicationCommandOptionProperties` instance.

> [!WARNING]
> The default parameter building pipeline is isolated and will not be disturbed by the [TypeConverter] workflow.
> But changes made in this method will override the values generated by the
> [InteractionService] for a **Discord Application Command Option**.

## Example Enum TypeConverter

[!code-csharp[Enum Converter](samples/typeconverters/enum_converter.cs)]

> [!IMPORTANT]
> TypeConverters must be registered prior to module discovery.
> If Interaction Service encounters a parameter type that doesn't belong to any of the
> registered [TypeConverters] during this phase, it will throw an exception.

## Concrete TypeConverters

Registering Concrete TypeConverters are as simple as creating an instance of your custom converter and invoking `AddTypeConverter()` method.

```csharp
interactionService.AddTypeConverter<string[]>(new StringArrayConverter());
```

## Generic TypeConverters

To register a generic `TypeConverter<T>`, you need to invoke the `AddGenericTypeConverter()` method of the Interaction Service class.
You need to pass the type of your `TypeConverter<T>` and a target base type to this method.

For instance, to register the previously mentioned enum converter the following can be used:

```csharp
interactionService.AddGenericTypeConverter<Enum>(typeof(EnumConverter<>));
```

Interaction service checks if the target base type satisfies the type constraints of the Generic `TypeConverter` class.

> [!NOTE]
> Dependencies of Generic TypeConverters are also resolved using the Dependency Injection pattern.

[TypeConverter]: xref:Discord.Interactions.TypeConverter
[InteractionService]: xref:Discord.Interactions.InteractionService
[IChannel]: xref:Discord.IChannel
[IRole]: xref:Discord.IRole
[IUser]: xref:Discord.IUser
[IMentionable]: xref:Discord.IMentionable

+ 0
- 32
docs/guides/interactions/application-commands/01-getting-started.md View File

@@ -1,32 +0,0 @@
---
uid: Guides.SlashCommands.Intro
title: Introduction to slash commands
---


# Getting started with application commands.

Welcome! This guide will show you how to use application commands.

## What is an application command?

Application commands consist of three different types. Slash commands, context menu User commands and context menu Message commands.
Slash commands are made up of a name, description, and a block of options, which you can think of like arguments to a function. The name and description help users find your command among many others, and the options validate user input as they fill out your command.
Message and User commands are only a name, to the user. So try to make the name descriptive. They're accessed by right clicking (or long press, on mobile) a user or a message, respectively.

All three varieties of application commands have both Global and Guild variants. Your global commands are available in every guild that adds your application. You can also make commands for a specific guild; they're only available in that guild. The User and Message commands are more limited in quantity than the slash commands. For specifics, check out their respective guide pages.

An Interaction is the message that your application receives when a user uses a command. It includes the values that the user submitted, as well as some metadata about this particular instance of the command being used: the guild_id, channel_id, member and other fields. You can find all the values in our data models.

## Authorizing your bot for application commands

There is a new special OAuth2 scope for applications called `applications.commands`. In order to make Application Commands work within a guild, the guild must authorize your application with the `applications.commands` scope. The bot scope is not enough.

Head over to your discord applications OAuth2 screen and make sure to select the `application.commands` scope.

![OAuth2 scoping](slash-commands/images/oauth.png)

From there you can then use the link to add your bot to a server.

> [!NOTE]
> In order for users in your guild to use your slash commands, they need to have the "Use Slash Command" permission on the guild.

+ 0
- 27
docs/guides/interactions_framework/autocompleters.md View File

@@ -1,27 +0,0 @@
---
uid: Guides.InteractionsFramework.Autocompleters
title: Autocompleters
---

# Autocompleters

Autocompleters provide a similar pattern to TypeConverters. Autocompleters are cached, singleton services and they are used by the Interaction Service to handle Autocomplete Interations targeted to a specific Slash Command parameter.

To start using Autocompleters, use the `[AutocompleteAttribute(Type autocompleterType)]` overload of the `[AutocompleteAttribute]`. This will dynamically link the parameter to the Autocompleter type.

## Creating Autocompleters

A valid Autocompleter must inherit `AutocompleteHandler` base type and implement all of its abstract methods.

### GenerateSuggestionsAsync()

Interactions Service uses this method to generate a response to a Autocomplete Interaction. This method should return `AutocompletionResult.FromSuccess(IEnumerable<AutocompleteResult>)` to display parameter sugesstions to the user. If there are no suggestions to be presented to the user, you have two options:

1. Returning the parameterless `AutocompletionResult.FromSuccess()` will display "No options match your search." message to the user.
2. Returning `AutocompleteResult.FromError()` will make the Interaction Service not respond to the interation, consequently displaying the user "Loading options failed." message.

## Resolving Autocompleter Dependencies

Autocompleter dependencies are resolved using the same dependency injection pattern as the Interaction Modules. Property injection and constructor injection are both valid ways to get service dependencies.

Because Autocompleters are constructed at service startup, class dependencies are resolved only once. If you need to access per-request dependencies you can use the IServiceProvider parameter of the `GenerateSuggestionsAsync()` method.

+ 0
- 27
docs/guides/interactions_framework/dependency-injection.md View File

@@ -1,27 +0,0 @@
---
uid: Guides.InteractionsFramework.DependencyInjection
title: Dependency Injection
---

# Dependency Injection

Interaction Service uses dependency injection to perform most of its operations. This way, you can access service dependencies throughout the framework.

## Setup

1. Create a `Microsoft.Extensions.DependencyInjection.ServiceCollection`.
2. Add the dependencies you wish to use in the modules.
3. Build a `IServiceProvider` using the `BuildServiceProvider()` method of the `ServiceCollection`.
4. Pass the `IServiceProvider` to `AddModulesAsync()`, `AddModuleAsync()` and `ExecuteAsync()` methods.

## Accessing the Dependencies

Services of a `IServiceProvider` can be accessed using *Contructor Injection* and *Property Injection*.

Interaction Service will populate the constructor parameters using the provided `IServiceProvider`. Any public settable class Property will also be populated in the same manner.

## Service Scopes

Interaction Service has built-in support for scoped service types. Scoped lifetime services are instantiated once per command execution. Including the Preconditon checks, every module operation is executed within a single service scope (which is sepearate from the global service scope).

> For more in-depth information about service lifetimes check out [Microsoft Docs](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-5.0#service-lifetimes-1).

+ 0
- 360
docs/guides/interactions_framework/intro.md View File

@@ -1,360 +0,0 @@
---
uid: Guides.InteractionsFramework.Intro
title: Introduction to the Interaction Framework
---

# Getting Started

Interaction Service provides an attribute based framework for creating Discord Interaction handlers.

To start using the Interaction Service, you need to create a service instance. Optionally you can provide the `InterctionService` constructor with a `InteractionServiceConfig` to change the services behaviour to suit your needs.

```csharp
...

var commands = new InteractionService(discord);

...
```

## Modules

Attribute based Interaction handlers must be defined within a command module class. Command modules are responsible for executing the Interaction handlers and providing them with the necessary execution info and helper functions.

Command modules are transient objects. A new module instance is created before a command execution starts then it will be disposed right after the method returns.

Every module class must:

- be public
- inherit `InteractionModuleBase`

Optionally you can override the included :

- OnModuleBuilding (executed after the module is built)
- BeforeExecute (executed before a command execution starts)
- AfterExecute (executed after a command execution concludes)

methods to configure the modules behaviour.

Every command module exposes a set of helper methods, namely:

- `RespondAsync()` => Respond to the interaction
- `FollowupAsync()` => Create a followup message for an interaction
- `ReplyAsync()` => Send a message to the origin channel of the interaction
- `DeleteOriginalResponseAsync()` => Delete the original interaction response

## Commands

Valid **Interaction Commands** must comply with the following requirements:

| | return type | max parameter count | allowed parameter types | attribute |
|-------------------------------|------------------------------|---------------------|-------------------------------|--------------------------|
|[Slash Command](#slash-commands)| `Task`/`Task<RuntimeResult>` | 25 | any* | `[SlashCommand]` |
|[User Command](#user-commands) | `Task`/`Task<RuntimeResult>` | 1 | Implementations of `IUser` | `[UserCommand]` |
|[Message Command](#message-commands)| `Task`/`Task<RuntimeResult>` | 1 | Implementations of `IMessage` | `[MessageCommand]` |
|[Component Interaction Command](#component-interaction-commands)| `Task`/`Task<RuntimeResult>` | inf | `string` or `string[]` | `[ComponentInteraction]` |
|[Autocomplete Command](#autocomplete-commands)| `Task`/`Task<RuntimeResult>` | - | - | `[AutocompleteCommand]`|

> [!NOTE]
> a `TypeConverter` that is capable of parsing type in question must be registered to the `InteractionService` instance.

You should avoid using long running code in your command module. Depending on your setup, long running code may block the Gateway thread of your bot, interrupting its connection to Discord.

### Slash Commands

Slash Commands are created using the `[SlashCommandAttribute]`. Every Slash Command must declare a name and a description. You can check Discords **Application Command Naming Guidelines** [here](https://discord.com/developers/docs/interactions/application-commands#application-command-object-application-command-naming).

```csharp
[SlashCommand("echo", "Echo an input")]
public async Task Echo(string input)
{
await RespondAsync(input);
}
```

#### Parameters

Slash Commands can have up to 25 method parameters. You must name your parameters in accordance with [Discords Naming Guidelines](https://discord.com/developers/docs/interactions/application-commands#application-command-object-application-command-naming). Interaction Service also features a pascal casing seperator for formatting parameter names with pascal casing into Discord compliant parameter names('parameterName' => 'parameter-name'). By default, your methods can feature the following parameter types:

- Implementations of `IUser`
- Implementations of `IChannel`*
- Implementations of `IRole`
- Implementations of `IMentionable`
- `string`
- `float`, `double`, `decimal`
- `bool`
- `char`
- `sbyte`, `byte`
- `int16`, `int32`, `int64`
- `uint16`, `uint32`, `uint64`
- `enum` (Values are registered as multiple choice options and are enforced by Discord. Use `[HideAttribute]' on enum values to prevent them from getting registered.)
- `DateTime`
- `TimeSpan`

---

**You can use more specialized implementations of `IChannel` to restrict the allowed channel types for a channel type option.*
| interface | Channel Type |
|---------------------|-------------------------------|
| `IStageChannel` | Stage Channels |
| `IVoiceChannel` | Voice Channels |
| `IDMChannel` | DM Channels |
| `IGroupChannel` | Group Channels |
| `ICategory Channel` | Category Channels |
| `INewsChannel` | News Channels |
| `IThreadChannel` | Public, Private, News Threads |
| `ITextChannel` | Text Channels |

---

##### Optional Parameters

Parameters with default values (ie. `int count = 0`) will be displayed as optional parameters on Discord Client.

##### Parameter Summary

By using the `[SummaryAttribute]` you can customize the displayed name and description of a parameter

```csharp
[Summary(description: "this is a parameter description")] string input
```

##### Parameter Choices

`[ChoiceAttribute]` can be used to add choices to a parameter.

```csharp
[SlashCommand("blep", "Send a random adorable animal photo")]
public async Task Blep([Choice("Dog","dog"), Choice("Cat", "cat"), Choice("Penguin", "penguin")] string animal)
{
...
}
```

In most cases, instead of relying on this attribute, you should use an `Enum` to create multiple choice parameters. Ex.

```csharp
public enum Animal
{
Cat,
Dog,
Penguin
}

[SlashCommand("blep", "Send a random adorable animal photo")]
public async Task Blep(Animal animal)
{
...
}
```

This Slash Command will be displayed exactly the same as the previous example.

##### Channel Types

Channel types for an `IChannel` parameter can also be restricted using the `[ChannelTypesAttribute]`.

```csharp
[SlashCommand("name", "Description")]
public async Task Command([ChannelTypes(ChannelType.Stage, ChannelType.Text)]IChannel channel)
{
...
}
```

In this case, user can only input Stage Channels and Text Channels to this parameter.

##### Autocomplete

You can enable Autocomple Interactions for a Slash Command parameter using the `[AutocompleteAttribute]`. To handle the Autocomplete Interactions raised by this parameter you can either create [Autocomplete Commands](#autocomplete-commands) or you can opt to use the [Autocompleters Pattern](./autocompleters)

##### Min/Max Value

You can specify the permitted max/min value for a number type parameter using the `[MaxValueAttribute]` and `[MinValueAttribute]`.

### User Commands

A valid User Command must have the following structure:

```csharp
[UserCommand("Say Hello")]
public async Task SayHello(IUser user)
{
...
}
```

User commands can only have one parameter and its type must be an implementation of `IUser`.

### Message Commands

A valid Message Command must have the following structure:

```csharp
[MessageCommand("Bookmark")]
public async Task Bookmark(IMessage user)
{
...
}
```

Message commands can only have one parameter and its type must be an implementation of `IMessage`.

### Component Interaction Commands

Component Interaction Commands are used to handle interactions that originate from **Discord Message Component**s. This pattern is particularly useful if you will be reusing a set a **Custom ID**s.

```csharp
[ComponentInteraction("custom_id")]
public async Task RoleSelection()
{
...
}
```

Component Interaction Commands support wild card matching, by default `*` character can be used to create a wild card pattern. Interaction Service will use lazy matching to capture the words corresponding to the wild card character. And the captured words will be passed on to the command method in the same order they were captured.

*Ex.*

If Interaction Service recieves a component interaction with **player:play,rickroll** custom id, `op` will be *play* and `name` will be *rickroll*

```csharp
[ComponentInteraction("player:*,*")]
public async Task Play(string op, string name)
{
...
}
```

You may use as many wild card characters as you want.

#### Select Menus

Unlike button interactions, select menu interactions also contain the values of the selected menu items. In this case, you should structure your method to accept a string array.

```csharp
[ComponentInteraction("role_selection")]
public async Task RoleSelection(string[] selectedRoles)
{
...
}
```

Wild card pattern can also be used to match select menu custom ids but remember that the array containing the select menu values should be the last parameter.

```csharp
[ComponentInteraction("role_selection_*")]
public async Task RoleSelection(string id, string[] selectedRoles)
{
...
}
```

### Autocomplete Commands

Autocomplete commands must be parameterless methods. A valid Autocomplete command must have the following structure:

```csharp
[AutocompleteCommand("command_name", "parameter_name")]
public async Task Autocomplete()
{
IEnumerable<AutocompleteResult> results;

...

await (Context.Interaction as SocketAutocompleteInteraction).RespondAsync(results);
}
```

Alternatively, you can use the *Autocompleters* to simplify this workflow.

## Interaction Context

Every command module provides its commands with an execution context. This context property includes general information about the underlying interaction that triggered the command execution. The base command context.

You can design your modules to work with different implementation types of `IInteractionContext`. To achieve this, make sure your module classes inherit from the generic variant of the `InteractionModuleBase`.

> Context type must be consistent throughout the project, or you will run into issues during runtime.

Interaction Service ships with 4 different kinds of `InteractionContext`s:

1. InteractionContext: A bare-bones execution context consisting of only implementation netural interfaces
2. SocketInteractionContext: An execution context for use with `DiscordSocketClient`. Socket entities are exposed in this context without the need of casting them.
3. ShardedInteractionContext: `DiscordShardedClient` variant of the `SocketInteractionContext`
4. RestInteractionContext: An execution context designed to be used with a `DiscordRestClient` and webhook based interactions pattern

You can create custom Interaction Contexts by implementing the `IInteracitonContext` interface.

One problem with using the concrete type InteractionContexts is that you cannot access the information that is specific to different interaction types without casting. Concrete type interaction contexts are great for creating shared interaction modules but you can also use the generic variants of the built-in interaction contexts to create interaction specific interaction modules.

Ex.
Message component interactions have access to a special method called `UpdateAsync()` to update the body of the method the interaction originated from. Normally this wouldn't be accessable without casting the `Context.Interaction`.

```csharp
discordClient.ButtonExecuted += async (interaction) =>
{
var ctx = new SocketInteractionContext<SocketMessageComponent>(discordClient, interaction);
await interactionService.ExecuteAsync(ctx, serviceProvider);
};

public class MessageComponentModule : InteractionModuleBase<SocketInteractionContext<SocketMessageComponent>>
{
[ComponentInteraction("custom_id")]
public async Command()
{
Context.Interaction.UpdateAsync(...);
}
}
```

## Loading Modules

Interaction Service can automatically discover and load modules that inherit `InteractionModuleBase` from an `Assembly`. Call `InteractionService.AddModulesAsync()` to use this functionality.

You can also manually add Interaction modules using the `InteractionService.AddModuleAsync()` method by providing the module type you want to load.

## Resolving Module Dependencies

Module dependencies are resolved using the Constructor Injection and Property Injection patterns. Meaning, the constructor parameters and public settable properties of a module will be assigned using the `IServiceProvider`. For more information on dependency injection, check out [Dependency Injection](./dependency-injection.md)

## Module Groups

Module groups allow you to create sub-commands and sub-commands groups. By nesting commands inside a module that is tagged with `[GroupAttribute]` you can create prefixed commands.

Although creating nested module stuctures are allowed, you are not permitted to use more than 2 `[GroupAttribute]`s in module hierarchy.

## Executing Commands

Any of the following socket events can be used to execute commands:

- InteractionCreated
- ButtonExecuted
- SelectMenuExecuted
- AutocompleteExecuted
- UserCommandExecuted
- MessageCommandExecuted

Commands can be either executed on the gateway thread or on a seperate thread from the thread pool. This behaviour can be configured by changing the *RunMode* property of `InteractionServiceConfig` or by setting the *runMode* parameter of a command attribute.

You can also configure the way `InteractionService` executes the commands. By default, commands are executed using `ConstructorInfo.Invoke()` to create module instances and `MethodInfo.Invoke()` method for executing the method bodies. By setting, `InteractionServiceConfig.UseCompiledLambda` to `true`, you can make `InteractionService` create module instances and execute commands using *Compiled Lambda* expressions. This cuts down on command execution time but it might add some memory overhead.

Time it takes to create a module instance and execute a `Task.Delay(0)` method using the Reflection methods compared to Compiled Lambda expressions:

| Method | Mean | Error | StdDev |
|----------------- |----------:|---------:|---------:|
| ReflectionInvoke | 225.93 ns | 4.522 ns | 7.040 ns |
| CompiledLambda | 48.79 ns | 0.981 ns | 1.276 ns |

## Registering Commands to Discord

Application commands loaded to the Interaction Service can be registered to Discord using a number of different methods. In most cases `RegisterCommandsGloballyAsync()` and `RegisterCommandsToGuildAsync()` are the methods to use. Command registration methods can only be used after the gateway client is ready or the rest client is logged in.

In debug environment, since Global commands can take up to 1 hour to register/update, you should register your commands to a test guild for your changes to take effect immediately. You can use the preprocessor directives to create a simple logic for registering commands:

```csharp
#if DEBUG
await interactionService.RegisterCommandsToGuildAsync(<test_guild_id>);
#else
await interactionService.RegisterCommandsGloballyAsync();
#endif
```

+ 0
- 73
docs/guides/interactions_framework/post_execution.md View File

@@ -1,73 +0,0 @@
---
uid: Guides.InteractionsFramework.PostEx
title: Post-Execution
---

# Post-Execution Logic

Interaction Service uses `IResult`s to provide information about the state of command execution. These can be used to log internal exceptions or provide some insight to the command user.

If you are running your commands using `RunMode.Sync` these command results can be retrieved from the return value of `InteractionService.ExecuteCommandAsync()` method or by registering delegates to Interaction Service events.

If you are using the `RunMode.Async` to run your commands, you must use the Interaction Service events to get the execution results. When using `RunMode.Async`, `InteractionService.ExecuteCommandAsync()` will always return a successful result.

## Results

Interaction Result come in a handful of different flavours:

1. `AutocompletionResult`: returned by Autocompleters
2. `ExecuteResult`: contains the result of method body execution process
3. `PreconditionGroupResult`: returned by Precondition groups
4. `PreconditionResult`: returned by preconditions
5. `RuntimeResult`: a user implementable result for returning user defined results
6. `SearchResult`: returned by command lookup map
7. `TypeConverterResult`: returned by TypeConverters

You can either use the `IResult.Error` property of an Interaction result or create type check for the afformentioned result types to branch out your post-execution logic to handle different situations.

## CommandExecuted Events

Every time a command gets executed, Interaction Service raises a *CommandExecuted event. These events can be used to create a post-execution pipeline.

```csharp
interactionService.SlashCommandExecuted += SlashCommandExecuted;

async Task SlashCommandExecuted (SlashCommandInfo arg1, Discord.IInteractionContext arg2, IResult arg3)
{
if (!arg3.IsSuccess)
{
switch (arg3.Error)
{
case InteractionCommandError.UnmetPrecondition:
await arg2.Interaction.RespondAsync($"Unmet Precondition: {arg3.ErrorReason}");
break;
case InteractionCommandError.UnknownCommand:
await arg2.Interaction.RespondAsync("Unknown command");
break;
case InteractionCommandError.BadArgs:
await arg2.Interaction.RespondAsync("Invalid number or arguments");
break;
case InteractionCommandError.Exception:
await arg2.Interaction.RespondAsync($"Command exception:{arg3.ErrorReason}");
break;
case InteractionCommandError.Unsuccessful:
await arg2.Interaction.RespondAsync("Command could not be executed");
break;
default:
break;
}
}
}
```

## Log Event

InteractionService regularly outputs information about the occuring events to keep the developer informed.

## Runtime Result

Interaction commands allow you to return `Task<RuntimeResult>` to pass on additional information about the command execution process back to your post-execution logic.

Custom `RuntimeResult` classes can be created by inheriting the base `RuntimeResult` class.

If command execution process reaches the method body of the command and no exceptions are thrown during the execution of the method body, `RuntimeResult` returned by your command will be accessible by casting/type-checking the `IResult` parameter of the *CommandExecuted event delegate.

+ 0
- 8
docs/guides/interactions_framework/preconditions.md View File

@@ -1,8 +0,0 @@
---
uid: Guides.InteractionsFramework.Preconditions
title: Preconditions
---

# Preconditions

Preconditions in Interaction Service work exactly the same as they do in ***Discord.Net.Commands***. For more information, check out [Preconditions](../commands/preconditions.md)

+ 0
- 130
docs/guides/interactions_framework/typeconverters.md View File

@@ -1,130 +0,0 @@
---
uid: Guides.InteractionsFramework.TypeConverters
title: Type Converters
---

# TypeConverters

TypeConverters are responsible for registering command parameters to Discord and parsing the user inputs into method parameters.

By default, TypeConverters for the following types are provided with `Discord.Net.Interactions` library.

- Implementations of `IUser`
- Implementations of `IChannel`
- Implementations of `IRole`
- Implementations of `IMentionable`
- `string`
- `float`, `double`, `decimal`
- `bool`
- `char`
- `sbyte`, `byte`
- `int16`, `int32`, `int64`
- `uint16`, `uint32`, `uint64`
- `enum`
- `DateTime`
- `TimeSpan`

## Creating TypeConverters

Depending on your needs, there are two types of `TypeConverter`s you can create:

- Concrete type
- Generic type

A valid converter must inherit `TypeConverter` base type. And override the abstract base methods.

### CanConvertTo() Method

This method is used by Interaction Service to search for alternative Type Converters.

Interaction Services determines the most suitable `TypeConverter` for a parameter type in the following order:

1. It searches for a `TypeConverter` that is registered to specifically target that parameter type
2. It searches for a generic `TypeConverter` with a matching type constraint. If there are more multiple matches, the one whose type constraint is the most specialized will be chosen.
3. It searches for a `TypeConverter` that returns `true` when its `CanConvertTo()` method is invoked for thaty parameter type.

> Alternatively, you can use the generic variant (`TypeConverter<T>`) of the `TypeConverter` base class which implements the following method body for `CanConvertTo()` method

```csharp
public sealed override bool CanConvertTo (Type type) =>
typeof(T).IsAssignableFrom(type);
```

### GetDiscordType() Method

This method is used by Interaction Service to determine the [Discord Application Command Option type](https://discord.com/developers/docs/interactions/application-commands#application-command-object-application-command-option-type) of a parameter type.

### ReadAsync() Method

This method is used by Interaction Service to parse the user input. This method should return `TypeConverterResult.FromSuccess` if the parsing operation is successful, otherwise it should return `TypeConverterResult.FromError`. The inner logic of this method is totally up to you, however you should avoid using long running code.

### Write() Method

This method is used to configure the **Discord Application Command Option** before it gets registered to Discord. Command Option is configured by modifying the `ApplicationCommandOptionProperties` instance.

The default parameter building pipeline is isolated and will not be disturbed by the `TypeConverter` workflow. But changes made in this method will override the values generated by the Interaction Service for a **Discord Application Command Option**.

---

### Example Enum TypeConverter

```csharp
internal sealed class EnumConverter<T> : TypeConverter<T> where T : struct, Enum
{
public override ApplicationCommandOptionType GetDiscordType ( ) => ApplicationCommandOptionType.String;

public override Task<TypeConverterResult> ReadAsync (IInteractionCommandContext context, SocketSlashCommandDataOption option, IServiceProvider services)
{
if (Enum.TryParse<T>((string)option.Value, out var result))
return Task.FromResult(TypeConverterResult.FromSuccess(result));
else
return Task.FromResult(TypeConverterResult.FromError(InteractionCommandError.ConvertFailed, $"Value {option.Value} cannot be converted to {nameof(T)}"));
}

public override void Write (ApplicationCommandOptionProperties properties, IParameterInfo parameterInfo)
{
var names = Enum.GetNames(typeof(T));
if (names.Length <= 25)
{
var choices = new List<ApplicationCommandOptionChoiceProperties>();

foreach (var name in names)
choices.Add(new ApplicationCommandOptionChoiceProperties
{
Name = name,
Value = name
});

properties.Choices = choices;
}
}
}
```

---

## Registering TypeConverters

> TypeConverters must be registered prior to module discovery. If Interaction Service encounters a parameter type that doesn't belong to any of the registered `TypeConverter`s during this phase, it will throw an exception.

### Concrete TypeConverters

Registering Concrete TypeConverters are as simple as creating an instance of your custom converter and invoking `AddTypeConverter()` method.

```csharp
interactionService.AddTypeConverter<string[]>(new StringArrayConverter());
```

### Generic TypeConverters

To register a generic TypeConverter, you need to invoke the `AddGenericTypeConverter()` method of the Interaction Service class. You need to pass the type of your `TypeConverter` and a target base type to this method.

For instance, to register the previously mentioned [Example Enum Converter](#example-enum-converter) the following can be used:

```csharp
interactionService.AddGenericTypeConverter<Enum>(typeof(EnumConverter<>));
```

Interaction service checks if the target base type satisfies the type constraints of the Generic TypeConverter class.

> Dependencies of Generic TypeConverters are also resolved using the Dependency Injection pattern.

+ 3
- 6
docs/guides/introduction/intro.md View File

@@ -23,7 +23,7 @@ in [our GitHub repository].
> Please note that you should *not* try to blindly copy paste > Please note that you should *not* try to blindly copy paste
> the code. The examples are meant to be a template or a guide. > the code. The examples are meant to be a template or a guide.


[our GitHub repository]: https://github.com/RogueException/Discord.Net/tree/dev/samples
[our GitHub repository]: https://github.com/discord-net/Discord.Net/
[Task-based Asynchronous Pattern]: https://docs.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/task-based-asynchronous-pattern-tap [Task-based Asynchronous Pattern]: https://docs.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/task-based-asynchronous-pattern-tap
[polymorphism]: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/polymorphism [polymorphism]: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/polymorphism
[interface]: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interfaces/ [interface]: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interfaces/
@@ -44,8 +44,5 @@ resources to get you started.


## Still have questions? ## Still have questions?


Please visit us at `#dotnet_discord-net` on the [Discord API] server.
Describe the problem in details to us, what you've done, and,
if any, the problematic code uploaded onto [Hastebin](https://hastebin.com).

[Discord API]: https://discord.gg/jkrBmQR
Please visit us at our [Discord](https://discord.gg/dnet) server.
Describe the problem in details to us, what you've tried and what you need help with.

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save