* 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: 41b4686b19a66bf8
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: 9d6dc6273cd9f399
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: 9d6dc627adf3a9c4
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>
- #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)
- #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).
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)
@@ -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:
@@ -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.
[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.
[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.*
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`.
[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:
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>();
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.
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.
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).
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 |
> 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.*
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:
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`.
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:
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:
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.
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.
Preconditions in Interaction Service work exactly the same as they do in ***Discord.Net.Commands***. For more information, check out [Preconditions](../commands/preconditions.md)
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.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>();
> 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.
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:
Thank you for your continuous support to the Openl Qizhi Community AI Collaboration Platform. In order to protect your usage rights and ensure network security, we updated the Openl Qizhi Community AI Collaboration Platform Usage Agreement in January 2024. The updated agreement specifies that users are prohibited from using intranet penetration tools. After you click "Agree and continue", you can continue to use our services. Thank you for your cooperation and understanding.