| @@ -30,7 +30,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "01_basic_ping_bot", "sample | |||||
| EndProject | EndProject | ||||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "02_commands_framework", "samples\02_commands_framework\02_commands_framework.csproj", "{4E1F1F40-B1DD-40C9-A4B1-A2046A4C9C76}" | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "02_commands_framework", "samples\02_commands_framework\02_commands_framework.csproj", "{4E1F1F40-B1DD-40C9-A4B1-A2046A4C9C76}" | ||||
| EndProject | EndProject | ||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "03_sharded_client", "samples\03_sharded_client\03_sharded_client.csproj", "{9B4C4AFB-3D15-44C6-9E36-12ED625AAA26}" | |||||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "03_sharded_client", "samples\03_sharded_client\03_sharded_client.csproj", "{9B4C4AFB-3D15-44C6-9E36-12ED625AAA26}" | |||||
| EndProject | |||||
| Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Examples", "Examples", "{D1F0271E-0EE2-4B66-AC3D-9871B7E1C4CF}" | |||||
| EndProject | |||||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Examples", "src\Discord.Net.Examples\Discord.Net.Examples.csproj", "{7EA96B2B-4D71-458D-9423-839362DC38BE}" | |||||
| EndProject | EndProject | ||||
| Global | Global | ||||
| GlobalSection(SolutionConfigurationPlatforms) = preSolution | GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
| @@ -174,6 +178,18 @@ Global | |||||
| {9B4C4AFB-3D15-44C6-9E36-12ED625AAA26}.Release|x64.Build.0 = Release|Any CPU | {9B4C4AFB-3D15-44C6-9E36-12ED625AAA26}.Release|x64.Build.0 = Release|Any CPU | ||||
| {9B4C4AFB-3D15-44C6-9E36-12ED625AAA26}.Release|x86.ActiveCfg = Release|Any CPU | {9B4C4AFB-3D15-44C6-9E36-12ED625AAA26}.Release|x86.ActiveCfg = Release|Any CPU | ||||
| {9B4C4AFB-3D15-44C6-9E36-12ED625AAA26}.Release|x86.Build.0 = Release|Any CPU | {9B4C4AFB-3D15-44C6-9E36-12ED625AAA26}.Release|x86.Build.0 = Release|Any CPU | ||||
| {7EA96B2B-4D71-458D-9423-839362DC38BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||||
| {7EA96B2B-4D71-458D-9423-839362DC38BE}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||||
| {7EA96B2B-4D71-458D-9423-839362DC38BE}.Debug|x64.ActiveCfg = Debug|Any CPU | |||||
| {7EA96B2B-4D71-458D-9423-839362DC38BE}.Debug|x64.Build.0 = Debug|Any CPU | |||||
| {7EA96B2B-4D71-458D-9423-839362DC38BE}.Debug|x86.ActiveCfg = Debug|Any CPU | |||||
| {7EA96B2B-4D71-458D-9423-839362DC38BE}.Debug|x86.Build.0 = Debug|Any CPU | |||||
| {7EA96B2B-4D71-458D-9423-839362DC38BE}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||||
| {7EA96B2B-4D71-458D-9423-839362DC38BE}.Release|Any CPU.Build.0 = Release|Any CPU | |||||
| {7EA96B2B-4D71-458D-9423-839362DC38BE}.Release|x64.ActiveCfg = Release|Any CPU | |||||
| {7EA96B2B-4D71-458D-9423-839362DC38BE}.Release|x64.Build.0 = Release|Any CPU | |||||
| {7EA96B2B-4D71-458D-9423-839362DC38BE}.Release|x86.ActiveCfg = Release|Any CPU | |||||
| {7EA96B2B-4D71-458D-9423-839362DC38BE}.Release|x86.Build.0 = Release|Any CPU | |||||
| EndGlobalSection | EndGlobalSection | ||||
| GlobalSection(SolutionProperties) = preSolution | GlobalSection(SolutionProperties) = preSolution | ||||
| HideSolutionNode = FALSE | HideSolutionNode = FALSE | ||||
| @@ -188,6 +204,7 @@ Global | |||||
| {F2FF84FB-F6AD-47E5-9EE5-18206CAE136E} = {BB59D5B5-E7B0-4BF4-8F82-D14431B2799B} | {F2FF84FB-F6AD-47E5-9EE5-18206CAE136E} = {BB59D5B5-E7B0-4BF4-8F82-D14431B2799B} | ||||
| {4E1F1F40-B1DD-40C9-A4B1-A2046A4C9C76} = {BB59D5B5-E7B0-4BF4-8F82-D14431B2799B} | {4E1F1F40-B1DD-40C9-A4B1-A2046A4C9C76} = {BB59D5B5-E7B0-4BF4-8F82-D14431B2799B} | ||||
| {9B4C4AFB-3D15-44C6-9E36-12ED625AAA26} = {BB59D5B5-E7B0-4BF4-8F82-D14431B2799B} | {9B4C4AFB-3D15-44C6-9E36-12ED625AAA26} = {BB59D5B5-E7B0-4BF4-8F82-D14431B2799B} | ||||
| {7EA96B2B-4D71-458D-9423-839362DC38BE} = {D1F0271E-0EE2-4B66-AC3D-9871B7E1C4CF} | |||||
| EndGlobalSection | EndGlobalSection | ||||
| GlobalSection(ExtensibilityGlobals) = postSolution | GlobalSection(ExtensibilityGlobals) = postSolution | ||||
| SolutionGuid = {D2404771-EEC8-45F2-9D71-F3373F6C1495} | SolutionGuid = {D2404771-EEC8-45F2-9D71-F3373F6C1495} | ||||
| @@ -101,9 +101,8 @@ namespace Discord | |||||
| /// <see cref="IGuild.GetChannelAsync"/>. Next, it checks if an overwrite had already been set via | /// <see cref="IGuild.GetChannelAsync"/>. Next, it checks if an overwrite had already been set via | ||||
| /// <see cref="GetPermissionOverwrite(Discord.IRole)"/>; if not, it denies the role from sending any | /// <see cref="GetPermissionOverwrite(Discord.IRole)"/>; if not, it denies the role from sending any | ||||
| /// messages to the channel. | /// messages to the channel. | ||||
| /// <code lang="cs" | |||||
| /// source="../Discord.Net.Examples/Core/Entities/Channels/IGuildChannel.Examples.cs" | |||||
| /// region="AddPermissionOverwriteAsyncRole"/> | |||||
| /// <code language="cs" region="AddPermissionOverwriteAsyncRole" | |||||
| /// source="..\..\..\Discord.Net.Examples\Core\Entities\Channels\IGuildChannel.Examples.cs"/> | |||||
| /// </example> | /// </example> | ||||
| /// <param name="role">The role to add the overwrite to.</param> | /// <param name="role">The role to add the overwrite to.</param> | ||||
| /// <param name="permissions">The overwrite to add to the role.</param> | /// <param name="permissions">The overwrite to add to the role.</param> | ||||
| @@ -121,9 +120,8 @@ namespace Discord | |||||
| /// <see cref="IGuild.GetChannelAsync"/>. Next, it checks if an overwrite had already been set via | /// <see cref="IGuild.GetChannelAsync"/>. Next, it checks if an overwrite had already been set via | ||||
| /// <see cref="GetPermissionOverwrite(Discord.IUser)"/>; if not, it denies the user from sending any | /// <see cref="GetPermissionOverwrite(Discord.IUser)"/>; if not, it denies the user from sending any | ||||
| /// messages to the channel. | /// messages to the channel. | ||||
| /// <code lang="cs" | |||||
| /// source="../Discord.Net.Examples/Core/Entities/Channels/IGuildChannel.Examples.cs" | |||||
| /// region="AddPermissionOverwriteAsyncUser"/> | |||||
| /// <code language="cs" region="AddPermissionOverwriteAsyncUser" | |||||
| /// source="..\..\..\Discord.Net.Examples\Core\Entities\Channels\IGuildChannel.Examples.cs"/> | |||||
| /// </example> | /// </example> | ||||
| /// <param name="user">The user to add the overwrite to.</param> | /// <param name="user">The user to add the overwrite to.</param> | ||||
| /// <param name="permissions">The overwrite to add to the user.</param> | /// <param name="permissions">The overwrite to add to the user.</param> | ||||
| @@ -16,11 +16,8 @@ namespace Discord | |||||
| /// <example> | /// <example> | ||||
| /// The following example sends a message with the current system time in RFC 1123 format to the channel and | /// The following example sends a message with the current system time in RFC 1123 format to the channel and | ||||
| /// deletes itself after 5 seconds. | /// deletes itself after 5 seconds. | ||||
| /// <code language="cs"> | |||||
| /// var message = await channel.SendMessageAsync(DateTimeOffset.UtcNow.ToString("R")); | |||||
| /// await Task.Delay(TimeSpan.FromSeconds(5)) | |||||
| /// .ContinueWith(x => message.DeleteAsync()); | |||||
| /// </code> | |||||
| /// <code language="cs" region="SendMessageAsync" | |||||
| /// source="..\..\..\Discord.Net.Examples\Core\Entities\Channels\IMessageChannel.Examples.cs" /> | |||||
| /// </example> | /// </example> | ||||
| /// <param name="text">The message to be sent.</param> | /// <param name="text">The message to be sent.</param> | ||||
| /// <param name="isTTS">Determines whether the message should be read aloud by Discord or not.</param> | /// <param name="isTTS">Determines whether the message should be read aloud by Discord or not.</param> | ||||
| @@ -35,18 +32,14 @@ namespace Discord | |||||
| /// Sends a file to this message channel with an optional caption. | /// Sends a file to this message channel with an optional caption. | ||||
| /// </summary> | /// </summary> | ||||
| /// <example> | /// <example> | ||||
| /// The following example uploads a local file called <c>wumpus.txt</c> along with the text | |||||
| /// <c>good discord boi</c> to the channel. | |||||
| /// <code language="cs"> | |||||
| /// await channel.SendFileAsync("wumpus.txt", "good discord boi"); | |||||
| /// </code> | |||||
| /// | |||||
| /// The following example uploads a local image called <c>b1nzy.jpg</c> embedded inside a rich embed to the | |||||
| /// channel. | |||||
| /// <code language="cs"> | |||||
| /// await channel.SendFileAsync("b1nzy.jpg", | |||||
| /// embed: new EmbedBuilder {ImageUrl = "attachment://b1nzy.jpg"}.Build()); | |||||
| /// </code> | |||||
| /// <para>The following example uploads a local file called <c>wumpus.txt</c> along with the text | |||||
| /// <c>good discord boi</c> to the channel.</para> | |||||
| /// <code language="cs" region="SendFileAsync.FilePath" | |||||
| /// source="..\..\..\Discord.Net.Examples\Core\Entities\Channels\IMessageChannel.Examples.cs" /> | |||||
| /// <para>The following example uploads a local image called <c>b1nzy.jpg</c> embedded inside a rich embed to the | |||||
| /// channel.</para> | |||||
| /// <code language="cs" region="SendFileAsync.FilePath.EmbeddedImage" | |||||
| /// source="..\..\..\Discord.Net.Examples\Core\Entities\Channels\IMessageChannel.Examples.cs" /> | |||||
| /// </example> | /// </example> | ||||
| /// <remarks> | /// <remarks> | ||||
| /// This method sends a file as if you are uploading an attachment directly from your Discord client. | /// This method sends a file as if you are uploading an attachment directly from your Discord client. | ||||
| @@ -72,10 +65,8 @@ namespace Discord | |||||
| /// <example> | /// <example> | ||||
| /// The following example uploads a streamed image that will be called <c>b1nzy.jpg</c> embedded inside a | /// The following example uploads a streamed image that will be called <c>b1nzy.jpg</c> embedded inside a | ||||
| /// rich embed to the channel. | /// rich embed to the channel. | ||||
| /// <code language="cs"> | |||||
| /// await channel.SendFileAsync(b1nzyStream, "b1nzy.jpg", | |||||
| /// embed: new EmbedBuilder {ImageUrl = "attachment://b1nzy.jpg"}.Build()); | |||||
| /// </code> | |||||
| /// <code language="cs" region="SendFileAsync.FileStream.EmbeddedImage" | |||||
| /// source="..\..\..\Discord.Net.Examples\Core\Entities\Channels\IMessageChannel.Examples.cs" /> | |||||
| /// </example> | /// </example> | ||||
| /// <remarks> | /// <remarks> | ||||
| /// This method sends a file as if you are uploading an attachment directly from your Discord client. | /// This method sends a file as if you are uploading an attachment directly from your Discord client. | ||||
| @@ -132,10 +123,8 @@ namespace Discord | |||||
| /// <example> | /// <example> | ||||
| /// The following example downloads 300 messages and gets messages that belong to the user | /// The following example downloads 300 messages and gets messages that belong to the user | ||||
| /// <c>53905483156684800</c>. | /// <c>53905483156684800</c>. | ||||
| /// <code lang="cs"> | |||||
| /// var messages = await messageChannel.GetMessagesAsync(300).FlattenAsync(); | |||||
| /// var userMessages = messages.Where(x => x.Author.Id == 53905483156684800); | |||||
| /// </code> | |||||
| /// <code language="cs" region="GetMessagesAsync.FromLimit.Standard" | |||||
| /// source="..\..\..\Discord.Net.Examples\Core\Entities\Channels\IMessageChannel.Examples.cs" /> | |||||
| /// </example> | /// </example> | ||||
| /// <param name="limit">The numbers of message to be gotten from.</param> | /// <param name="limit">The numbers of message to be gotten from.</param> | ||||
| /// <param name="mode">The <see cref="CacheMode" /> that determines whether the object should be fetched from | /// <param name="mode">The <see cref="CacheMode" /> that determines whether the object should be fetched from | ||||
| @@ -168,10 +157,13 @@ namespace Discord | |||||
| /// of flattening. | /// of flattening. | ||||
| /// </remarks> | /// </remarks> | ||||
| /// <example> | /// <example> | ||||
| /// The following example gets 5 message prior to the message identifier <c>442012544660537354</c>. | |||||
| /// <code lang="cs"> | |||||
| /// var messages = await channel.GetMessagesAsync(442012544660537354, Direction.Before, 5).FlattenAsync(); | |||||
| /// </code> | |||||
| /// <para>The following example gets 5 message prior to the message identifier <c>442012544660537354</c>.</para> | |||||
| /// <code language="cs" region="GetMessagesAsync.FromId.FromMessage" | |||||
| /// source="..\..\..\Discord.Net.Examples\Core\Entities\Channels\IMessageChannel.Examples.cs" /> | |||||
| /// <para>The following example attempts to retrieve <c>messageCount</c> number of messages from the | |||||
| /// beginning of the channel and prints them to the console.</para> | |||||
| /// <code language="cs" region="GetMessagesAsync.FromId.BeginningMessages" | |||||
| /// source="..\..\..\Discord.Net.Examples\Core\Entities\Channels\IMessageChannel.Examples.cs" /> | |||||
| /// </example> | /// </example> | ||||
| /// <param name="fromMessageId">The ID of the starting message to get the messages from.</param> | /// <param name="fromMessageId">The ID of the starting message to get the messages from.</param> | ||||
| /// <param name="dir">The direction of the messages to be gotten from.</param> | /// <param name="dir">The direction of the messages to be gotten from.</param> | ||||
| @@ -207,9 +199,8 @@ namespace Discord | |||||
| /// </remarks> | /// </remarks> | ||||
| /// <example> | /// <example> | ||||
| /// The following example gets 5 message prior to a specific message, <c>oldMessage</c>. | /// The following example gets 5 message prior to a specific message, <c>oldMessage</c>. | ||||
| /// <code lang="cs"> | |||||
| /// var messages = await channel.GetMessagesAsync(oldMessage, Direction.Before, 5).FlattenAsync(); | |||||
| /// </code> | |||||
| /// <code language="cs" region="GetMessagesAsync.FromMessage" | |||||
| /// source="..\..\..\Discord.Net.Examples\Core\Entities\Channels\IMessageChannel.Examples.cs" /> | |||||
| /// </example> | /// </example> | ||||
| /// <param name="fromMessage">The starting message to get the messages from.</param> | /// <param name="fromMessage">The starting message to get the messages from.</param> | ||||
| /// <param name="dir">The direction of the messages to be gotten from.</param> | /// <param name="dir">The direction of the messages to be gotten from.</param> | ||||
| @@ -263,12 +254,8 @@ namespace Discord | |||||
| /// </summary> | /// </summary> | ||||
| /// <example> | /// <example> | ||||
| /// The following example keeps the client in the typing state until <c>LongRunningAsync</c> has finished. | /// The following example keeps the client in the typing state until <c>LongRunningAsync</c> has finished. | ||||
| /// <code lang="cs"> | |||||
| /// using (messageChannel.EnterTypingState()) | |||||
| /// { | |||||
| /// await LongRunningAsync(); | |||||
| /// } | |||||
| /// </code> | |||||
| /// <code language="cs" region="EnterTypingState" | |||||
| /// source="..\..\..\Discord.Net.Examples\Core\Entities\Channels\IMessageChannel.Examples.cs" /> | |||||
| /// </example> | /// </example> | ||||
| /// <param name="options">The options to be used when sending the request.</param> | /// <param name="options">The options to be used when sending the request.</param> | ||||
| /// <returns> | /// <returns> | ||||
| @@ -40,7 +40,7 @@ namespace Discord | |||||
| /// </summary> | /// </summary> | ||||
| /// <example> | /// <example> | ||||
| /// The following example gets 250 messages from the channel and deletes them. | /// The following example gets 250 messages from the channel and deletes them. | ||||
| /// <code lang="cs"> | |||||
| /// <code language="cs"> | |||||
| /// var messages = await textChannel.GetMessagesAsync(250).FlattenAsync(); | /// var messages = await textChannel.GetMessagesAsync(250).FlattenAsync(); | ||||
| /// await textChannel.DeleteMessagesAsync(messages); | /// await textChannel.DeleteMessagesAsync(messages); | ||||
| /// </code> | /// </code> | ||||
| @@ -440,16 +440,8 @@ namespace Discord | |||||
| /// </summary> | /// </summary> | ||||
| /// <example> | /// <example> | ||||
| /// The following example creates a new text channel under an existing category named <c>Wumpus</c> with a set topic. | /// The following example creates a new text channel under an existing category named <c>Wumpus</c> with a set topic. | ||||
| /// <code lang="cs"> | |||||
| /// var categories = await guild.GetCategoriesAsync(); | |||||
| /// var targetCategory = categories.FirstOrDefault(x => x.Name == "wumpus"); | |||||
| /// if (targetCategory == null) return; | |||||
| /// await Context.Guild.CreateTextChannelAsync(name, x => | |||||
| /// { | |||||
| /// x.CategoryId = targetCategory.Id; | |||||
| /// x.Topic = $"This channel was created at {DateTimeOffset.UtcNow} by {user}."; | |||||
| /// }); | |||||
| /// </code> | |||||
| /// <code language="cs" region="CreateTextChannelAsync" | |||||
| /// source="..\..\..\Discord.Net.Examples\Core\Entities\Guilds\IGuild.Examples.cs"/> | |||||
| /// </example> | /// </example> | ||||
| /// <param name="name">The new name for the text channel.</param> | /// <param name="name">The new name for the text channel.</param> | ||||
| /// <param name="func">The delegate containing the properties to be applied to the channel upon its creation.</param> | /// <param name="func">The delegate containing the properties to be applied to the channel upon its creation.</param> | ||||
| @@ -23,7 +23,8 @@ namespace Discord | |||||
| /// <example> | /// <example> | ||||
| /// The following example attempts to retrieve the user's current avatar and send it to a channel; if one is | /// The following example attempts to retrieve the user's current avatar and send it to a channel; if one is | ||||
| /// not set, a default avatar for this user will be returned instead. | /// not set, a default avatar for this user will be returned instead. | ||||
| /// <code source="../Discord.Net.Examples/Core/Entities/Users/IUser.Examples.cs" region="GetAvatarUrl"/> | |||||
| /// <code language="cs" region="GetAvatarUrl" | |||||
| /// source="..\..\..\Discord.Net.Examples\Core\Entities\Users\IUser.Examples.cs"/> | |||||
| /// </example> | /// </example> | ||||
| /// <param name="format">The format to return.</param> | /// <param name="format">The format to return.</param> | ||||
| /// <param name="size">The size of the image to return in. This can be any power of two between 16 and 2048. | /// <param name="size">The size of the image to return in. This can be any power of two between 16 and 2048. | ||||
| @@ -91,8 +92,8 @@ namespace Discord | |||||
| /// <example> | /// <example> | ||||
| /// The following example attempts to send a direct message to the target user and logs the incident should | /// The following example attempts to send a direct message to the target user and logs the incident should | ||||
| /// it fail. | /// it fail. | ||||
| /// <code source="../Discord.Net.Examples/Core/Entities/Users/IUser.Examples.cs" | |||||
| /// region="GetOrCreateDMChannelAsync"/> | |||||
| /// <code region="GetOrCreateDMChannelAsync" language="cs" | |||||
| /// source="../../../Discord.Net.Examples/Core/Entities/Users/IUser.Examples.cs"/> | |||||
| /// </example> | /// </example> | ||||
| /// <param name="options">The options to be used when sending the request.</param> | /// <param name="options">The options to be used when sending the request.</param> | ||||
| /// <returns> | /// <returns> | ||||
| @@ -63,7 +63,7 @@ namespace Discord | |||||
| /// Gets a generic channel. | /// Gets a generic channel. | ||||
| /// </summary> | /// </summary> | ||||
| /// <example> | /// <example> | ||||
| /// <code lang="cs" title="Example method"> | |||||
| /// <code language="cs" title="Example method"> | |||||
| /// var channel = await _client.GetChannelAsync(381889909113225237); | /// var channel = await _client.GetChannelAsync(381889909113225237); | ||||
| /// if (channel != null && channel is IMessageChannel msgChannel) | /// if (channel != null && channel is IMessageChannel msgChannel) | ||||
| /// { | /// { | ||||
| @@ -194,7 +194,7 @@ namespace Discord | |||||
| /// Gets a user. | /// Gets a user. | ||||
| /// </summary> | /// </summary> | ||||
| /// <example> | /// <example> | ||||
| /// <code lang="cs" title="Example method"> | |||||
| /// <code language="cs" title="Example method"> | |||||
| /// var user = await _client.GetUserAsync(168693960628371456); | /// var user = await _client.GetUserAsync(168693960628371456); | ||||
| /// if (user != null) | /// if (user != null) | ||||
| /// Console.WriteLine($"{user} is created at {user.CreatedAt}."; | /// Console.WriteLine($"{user} is created at {user.CreatedAt}."; | ||||
| @@ -212,7 +212,7 @@ namespace Discord | |||||
| /// Gets a user. | /// Gets a user. | ||||
| /// </summary> | /// </summary> | ||||
| /// <example> | /// <example> | ||||
| /// <code lang="cs" title="Example method"> | |||||
| /// <code language="cs" title="Example method"> | |||||
| /// var user = await _client.GetUserAsync("Still", "2876"); | /// var user = await _client.GetUserAsync("Still", "2876"); | ||||
| /// if (user != null) | /// if (user != null) | ||||
| /// Console.WriteLine($"{user} is created at {user.CreatedAt}."; | /// Console.WriteLine($"{user} is created at {user.CreatedAt}."; | ||||
| @@ -232,7 +232,7 @@ namespace Discord | |||||
| /// </summary> | /// </summary> | ||||
| /// <example> | /// <example> | ||||
| /// The following example gets the most optimal voice region from the collection. | /// The following example gets the most optimal voice region from the collection. | ||||
| /// <code lang="cs"> | |||||
| /// <code language="cs"> | |||||
| /// var regions = await client.GetVoiceRegionsAsync(); | /// var regions = await client.GetVoiceRegionsAsync(); | ||||
| /// var optimalRegion = regions.FirstOrDefault(x => x.IsOptimal); | /// var optimalRegion = regions.FirstOrDefault(x => x.IsOptimal); | ||||
| /// </code> | /// </code> | ||||
| @@ -1,31 +1,46 @@ | |||||
| #region AddPermissionOverwriteAsyncRole | |||||
| public async Task MuteRoleAsync(IRole role, IGuildChannel channel) | |||||
| using System; | |||||
| using System.Threading.Tasks; | |||||
| using JetBrains.Annotations; | |||||
| namespace Discord.Net.Examples.Core.Entities.Channels | |||||
| { | { | ||||
| if (role == null) throw new ArgumentNullException(nameof(role)); | |||||
| if (channel == null) throw new ArgumentNullException(nameof(channel)); | |||||
| [PublicAPI] | |||||
| internal class GuildChannelExamples | |||||
| { | |||||
| #region AddPermissionOverwriteAsyncRole | |||||
| // Fetches the previous overwrite and bail if one is found | |||||
| var previousOverwrite = channel.GetPermissionOverwrite(role); | |||||
| if (previousOverwrite.HasValue && previousOverwrite.Value.SendMessages == PermValue.Deny) | |||||
| throw new InvalidOperationException($"Role {role.Name} had already been muted in this channel."); | |||||
| public async Task MuteRoleAsync(IRole role, IGuildChannel channel) | |||||
| { | |||||
| if (role == null) throw new ArgumentNullException(nameof(role)); | |||||
| if (channel == null) throw new ArgumentNullException(nameof(channel)); | |||||
| // Creates a new OverwritePermissions with send message set to deny and pass it into the method | |||||
| await channel.AddPermissionOverwriteAsync(role, new OverwritePermissions(sendMessages: PermValue.Deny)); | |||||
| } | |||||
| #endregion | |||||
| // Fetches the previous overwrite and bail if one is found | |||||
| var previousOverwrite = channel.GetPermissionOverwrite(role); | |||||
| if (previousOverwrite.HasValue && previousOverwrite.Value.SendMessages == PermValue.Deny) | |||||
| throw new InvalidOperationException($"Role {role.Name} had already been muted in this channel."); | |||||
| #region AddPermissionOverwriteAsyncUser | |||||
| public async Task MuteUserAsync(IGuildUser user, IGuildChannel channel) | |||||
| { | |||||
| if (role == null) throw new ArgumentNullException(nameof(user)); | |||||
| if (channel == null) throw new ArgumentNullException(nameof(channel)); | |||||
| // Creates a new OverwritePermissions with send message set to deny and pass it into the method | |||||
| await channel.AddPermissionOverwriteAsync(role, new OverwritePermissions(sendMessages: PermValue.Deny)); | |||||
| } | |||||
| #endregion | |||||
| #region AddPermissionOverwriteAsyncUser | |||||
| public async Task MuteUserAsync(IGuildUser user, IGuildChannel channel) | |||||
| { | |||||
| if (user == null) throw new ArgumentNullException(nameof(user)); | |||||
| if (channel == null) throw new ArgumentNullException(nameof(channel)); | |||||
| // Fetches the previous overwrite and bail if one is found | |||||
| var previousOverwrite = channel.GetPermissionOverwrite(user); | |||||
| if (previousOverwrite.HasValue && previousOverwrite.Value.SendMessages == PermValue.Deny) | |||||
| throw new InvalidOperationException($"User {user.Username} had already been muted in this channel."); | |||||
| // Fetches the previous overwrite and bail if one is found | |||||
| var previousOverwrite = channel.GetPermissionOverwrite(user); | |||||
| if (previousOverwrite.HasValue && previousOverwrite.Value.SendMessages == PermValue.Deny) | |||||
| throw new InvalidOperationException($"User {user.Name} had already been muted in this channel."); | |||||
| // Creates a new OverwritePermissions with send message set to deny and pass it into the method | |||||
| await channel.AddPermissionOverwriteAsync(user, new OverwritePermissions(sendMessages: PermValue.Deny)); | |||||
| } | |||||
| // Creates a new OverwritePermissions with send message set to deny and pass it into the method | |||||
| await channel.AddPermissionOverwriteAsync(user, new OverwritePermissions(sendMessages: PermValue.Deny)); | |||||
| #endregion | |||||
| } | |||||
| } | } | ||||
| #endregion | |||||
| @@ -0,0 +1,114 @@ | |||||
| using System; | |||||
| using System.Linq; | |||||
| using System.Net.Http; | |||||
| using System.Threading.Tasks; | |||||
| using JetBrains.Annotations; | |||||
| namespace Discord.Net.Examples.Core.Entities.Channels | |||||
| { | |||||
| [PublicAPI] | |||||
| internal class MessageChannelExamples | |||||
| { | |||||
| #region GetMessagesAsync.FromId.BeginningMessages | |||||
| public async Task PrintFirstMessages(IMessageChannel channel, int messageCount) | |||||
| { | |||||
| // Although the library does attempt to divide the messageCount by 100 | |||||
| // to comply to Discord's maximum message limit per request, sending | |||||
| // too many could still cause the queue to clog up. | |||||
| // The purpose of this exception is to discourage users from sending | |||||
| // too many requests at once. | |||||
| if (messageCount > 1000) | |||||
| throw new InvalidOperationException("Too many messages requested."); | |||||
| // Setting fromMessageId to 0 will make Discord | |||||
| // default to the first message in channel. | |||||
| var messages = await channel.GetMessagesAsync( | |||||
| 0, Direction.After, messageCount) | |||||
| .FlattenAsync(); | |||||
| // Print message content | |||||
| foreach (var message in messages) | |||||
| Console.WriteLine($"{message.Author} posted '{message.Content}' at {message.CreatedAt}."); | |||||
| } | |||||
| #endregion | |||||
| public async Task GetMessagesExampleBody(IMessageChannel channel) | |||||
| { | |||||
| #pragma warning disable IDISP001 | |||||
| #pragma warning disable IDISP014 | |||||
| // We're just declaring this for the sample below. | |||||
| // Ideally, you want to get or create your HttpClient | |||||
| // from IHttpClientFactory. | |||||
| // You get a bonus for reading the example source though! | |||||
| var httpClient = new HttpClient(); | |||||
| #pragma warning restore IDISP014 | |||||
| #pragma warning restore IDISP001 | |||||
| // Another dummy method | |||||
| Task LongRunningAsync() | |||||
| { | |||||
| return Task.Delay(0); | |||||
| } | |||||
| #region GetMessagesAsync.FromLimit.Standard | |||||
| var messages = await channel.GetMessagesAsync(300).FlattenAsync(); | |||||
| var userMessages = messages.Where(x => x.Author.Id == 53905483156684800); | |||||
| #endregion | |||||
| #region GetMessagesAsync.FromMessage | |||||
| var oldMessage = await channel.SendMessageAsync("boi"); | |||||
| var messagesFromMsg = await channel.GetMessagesAsync(oldMessage, Direction.Before, 5).FlattenAsync(); | |||||
| #endregion | |||||
| #region GetMessagesAsync.FromId.FromMessage | |||||
| await channel.GetMessagesAsync(442012544660537354, Direction.Before, 5).FlattenAsync(); | |||||
| #endregion | |||||
| #region SendMessageAsync | |||||
| var message = await channel.SendMessageAsync(DateTimeOffset.UtcNow.ToString("R")); | |||||
| await Task.Delay(TimeSpan.FromSeconds(5)) | |||||
| .ContinueWith(x => message.DeleteAsync()); | |||||
| #endregion | |||||
| #region SendFileAsync.FilePath | |||||
| await channel.SendFileAsync("wumpus.txt", "good discord boi"); | |||||
| #endregion | |||||
| #region SendFileAsync.FilePath.EmbeddedImage | |||||
| await channel.SendFileAsync("b1nzy.jpg", | |||||
| embed: new EmbedBuilder {ImageUrl = "attachment://b1nzy.jpg"}.Build()); | |||||
| #endregion | |||||
| #region SendFileAsync.FileStream.EmbeddedImage | |||||
| using (var b1nzyStream = await httpClient.GetStreamAsync("https://example.com/b1nzy")) | |||||
| await channel.SendFileAsync(b1nzyStream, "b1nzy.jpg", | |||||
| embed: new EmbedBuilder {ImageUrl = "attachment://b1nzy.jpg"}.Build()); | |||||
| #endregion | |||||
| #region EnterTypingState | |||||
| using (channel.EnterTypingState()) await LongRunningAsync(); | |||||
| #endregion | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,25 @@ | |||||
| using System; | |||||
| using System.Linq; | |||||
| using System.Threading.Tasks; | |||||
| using JetBrains.Annotations; | |||||
| namespace Discord.Net.Examples.Core.Entities.Guilds | |||||
| { | |||||
| [PublicAPI] | |||||
| internal class GuildExamples | |||||
| { | |||||
| #region CreateTextChannelAsync | |||||
| public async Task CreateTextChannelUnderWumpus(IGuild guild, string name) | |||||
| { | |||||
| var categories = await guild.GetCategoriesAsync(); | |||||
| var targetCategory = categories.FirstOrDefault(x => x.Name == "wumpus"); | |||||
| if (targetCategory == null) return; | |||||
| await guild.CreateTextChannelAsync(name, x => | |||||
| { | |||||
| x.CategoryId = targetCategory.Id; | |||||
| x.Topic = $"This channel was created at {DateTimeOffset.UtcNow}."; | |||||
| }); | |||||
| } | |||||
| #endregion | |||||
| } | |||||
| } | |||||
| @@ -1,22 +1,38 @@ | |||||
| #region GetAvatarUrl | |||||
| public async Task GetAvatarAsync(IUser user) | |||||
| { | |||||
| var userAvatarUrl = user.GetAvatarUrl() ?? user.GetDefaultAvatarUrl(); | |||||
| await textChannel.SendMessageAsync(userAvatarUrl); | |||||
| } | |||||
| #endregion | |||||
| using System; | |||||
| using System.Net; | |||||
| using System.Threading.Tasks; | |||||
| using JetBrains.Annotations; | |||||
| #region GetOrCreateDMChannelAsync | |||||
| public async Task MessageUserAsync(IUser user) | |||||
| namespace Discord.Net.Examples.Core.Entities.Users | |||||
| { | { | ||||
| var channel = await user.GetOrCreateDMChannelAsync(); | |||||
| try | |||||
| [PublicAPI] | |||||
| internal class UserExamples | |||||
| { | { | ||||
| await channel.SendMessageAsync("Awesome stuff!"); | |||||
| } | |||||
| catch (Discord.Net.HttpException ex) when (ex.HttpCode == 403) | |||||
| { | |||||
| Console.WriteLine($"Boo, I cannot message {user}"); | |||||
| #region GetAvatarUrl | |||||
| public async Task GetAvatarAsync(IUser user, ITextChannel textChannel) | |||||
| { | |||||
| var userAvatarUrl = user.GetAvatarUrl() ?? user.GetDefaultAvatarUrl(); | |||||
| await textChannel.SendMessageAsync(userAvatarUrl); | |||||
| } | |||||
| #endregion | |||||
| #region GetOrCreateDMChannelAsync | |||||
| public async Task MessageUserAsync(IUser user) | |||||
| { | |||||
| var channel = await user.GetOrCreateDMChannelAsync(); | |||||
| try | |||||
| { | |||||
| await channel.SendMessageAsync("Awesome stuff!"); | |||||
| } | |||||
| catch (Discord.Net.HttpException ex) when (ex.HttpCode == HttpStatusCode.Forbidden) | |||||
| { | |||||
| Console.WriteLine($"Boo, I cannot message {user}."); | |||||
| } | |||||
| } | |||||
| #endregion | |||||
| } | } | ||||
| } | } | ||||
| #endregion | |||||
| @@ -0,0 +1,21 @@ | |||||
| <Project Sdk="Microsoft.NET.Sdk"> | |||||
| <PropertyGroup> | |||||
| <TargetFramework>netstandard2.0</TargetFramework> | |||||
| </PropertyGroup> | |||||
| <ItemGroup> | |||||
| <Compile Remove="Core\Entities\Guilds\IGuild.Examples.cs" /> | |||||
| </ItemGroup> | |||||
| <ItemGroup> | |||||
| <None Include="Core\Entities\Guilds\IGuild.Examples.cs" /> | |||||
| </ItemGroup> | |||||
| <ItemGroup> | |||||
| <ProjectReference Include="..\Discord.Net.Core\Discord.Net.Core.csproj" /> | |||||
| <ProjectReference Include="..\Discord.Net.WebSocket\Discord.Net.WebSocket.csproj" /> | |||||
| <PackageReference Include="JetBrains.Annotations" Version="2018.3.0" /> | |||||
| </ItemGroup> | |||||
| </Project> | |||||
| @@ -1,90 +1,117 @@ | |||||
| #region ReactionAdded | |||||
| public void HookReactionAdded(BaseSocketClient client) | |||||
| { | |||||
| client.ReactionAdded += HandleReactionAddedAsync; | |||||
| } | |||||
| public async Task HandleReactionAddedAsync(Cacheable<IUserMessage, ulong> cachedMessage, | |||||
| ISocketMessageChannel originChannel, SocketReaction reaction) | |||||
| { | |||||
| var message = await cachedMessage.GetOrDownloadAsync(); | |||||
| if (message != null && reaction.User.IsSpecified) | |||||
| Console.WriteLine($"{message.User.Value} just added a reaction '{reaction.Emote}' " + | |||||
| $"to {message.Author}'s message ({message.Id})."); | |||||
| } | |||||
| #endregion | |||||
| using System; | |||||
| using System.Linq; | |||||
| using System.Threading.Tasks; | |||||
| using Discord.WebSocket; | |||||
| using JetBrains.Annotations; | |||||
| #region ChannelCreated | |||||
| public void HookChannelCreated(BaseSocketClient client) | |||||
| { | |||||
| client.ChannelCreated += HandleChannelCreated; | |||||
| } | |||||
| public Task HandleChannelCreated(SocketChannel channel) | |||||
| namespace Discord.Net.Examples.WebSocket | |||||
| { | { | ||||
| Console.WriteLine($"A new channel '{channel.Name}'({channel.Id}, {channel.GetType()})" | |||||
| + $"has been created at {channel.CreatedAt}."); | |||||
| return Task.CompletedTask; | |||||
| } | |||||
| #endregion | |||||
| [PublicAPI] | |||||
| internal class BaseSocketClientExamples | |||||
| { | |||||
| #region ReactionAdded | |||||
| #region ChannelDestroyed | |||||
| public void HookChannelDestroyed(BaseSocketClient client) | |||||
| { | |||||
| client.ChannelDestroyed += HandleChannelDestroyed; | |||||
| } | |||||
| public Task HandleChannelDestroyed(SocketChannel channel) | |||||
| { | |||||
| Console.WriteLine($"A new channel '{channel.Name}'({channel.Id}, {channel.GetType()}) has been deleted."); | |||||
| return Task.CompletedTask; | |||||
| } | |||||
| #endregion | |||||
| public void HookReactionAdded(BaseSocketClient client) | |||||
| => client.ReactionAdded += HandleReactionAddedAsync; | |||||
| #region ChannelUpdated | |||||
| public void HookChannelUpdated(BaseSocketClient client) | |||||
| { | |||||
| client.ChannelUpdated += HandleChannelRename; | |||||
| } | |||||
| public Task HandleChannelRename(SocketChannel beforeChannel, SocketChannel afterChannel) | |||||
| { | |||||
| if (beforeChannel.Name != afterChannel.Name) | |||||
| Console.WriteLine($"A channel ({beforeChannel.Id}) is renamed from {beforeChannel.Name} to {afterChannel.Name}."); | |||||
| return Task.CompletedTask; | |||||
| } | |||||
| #endregion | |||||
| public async Task HandleReactionAddedAsync(Cacheable<IUserMessage, ulong> cachedMessage, | |||||
| ISocketMessageChannel originChannel, SocketReaction reaction) | |||||
| { | |||||
| var message = await cachedMessage.GetOrDownloadAsync(); | |||||
| if (message != null && reaction.User.IsSpecified) | |||||
| Console.WriteLine($"{reaction.User.Value} just added a reaction '{reaction.Emote}' " + | |||||
| $"to {message.Author}'s message ({message.Id})."); | |||||
| } | |||||
| #region MessageReceived | |||||
| private readonly ulong[] _targetUserIds = new {168693960628371456, 53905483156684800}; | |||||
| public void HookMessageReceived(BaseSocketClient client) | |||||
| { | |||||
| client.MessageReceived += HandleMessageReceived; | |||||
| } | |||||
| public Task HandleMessageReceived(SocketMessage message) | |||||
| { | |||||
| // check if the message is a user message as opposed to a system message (e.g. Clyde, pins, etc.) | |||||
| if (!(message is SocketUserMessage userMessage)) return; | |||||
| // check if the message origin is a guild message channel | |||||
| if (!(userMessage.Channel is SocketTextChannel textChannel)) return; | |||||
| // check if the target user was mentioned | |||||
| var targetUsers = userMessage.MentionedUsers.Where(x => _targetUserIds.Contains(x)); | |||||
| if (targetUsers == null) return; | |||||
| foreach (var targetUser in targetUsers) | |||||
| Console.WriteLine($"{targetUser} was mentioned in the message '{message.Content}' by {message.Author}."); | |||||
| return Task.CompletedTask; | |||||
| } | |||||
| #endregion | |||||
| #endregion | |||||
| #region MessageDeleted | |||||
| public void HookMessageDeleted(BaseSocketClient client) | |||||
| { | |||||
| client.MessageDeleted += HandleMessageDelete; | |||||
| } | |||||
| public Task HandleMessageDelete(Cacheable<IMessage, ulong> cachedMessage, ISocketMessageChannel channel) | |||||
| { | |||||
| // check if the message exists in cache; if not, we cannot report what was removed | |||||
| if (!cachedMessage.HasValue) return; | |||||
| var message = cachedMessage.Value; | |||||
| Console.WriteLine($"A message ({message.Id}) from {message.Author} was removed from the channel {channel.Name} ({channel.Id}):" | |||||
| + Environment.NewLine | |||||
| + message.Content); | |||||
| return Task.CompletedTask; | |||||
| #region ChannelCreated | |||||
| public void HookChannelCreated(BaseSocketClient client) | |||||
| => client.ChannelCreated += HandleChannelCreated; | |||||
| public Task HandleChannelCreated(SocketChannel channel) | |||||
| { | |||||
| if (channel is SocketGuildChannel guildChannel) | |||||
| Console.WriteLine($"A new channel '{guildChannel.Name}'({guildChannel.Id}, {guildChannel.GetType()})" | |||||
| + $"has been created at {guildChannel.CreatedAt}."); | |||||
| return Task.CompletedTask; | |||||
| } | |||||
| #endregion | |||||
| #region ChannelDestroyed | |||||
| public void HookChannelDestroyed(BaseSocketClient client) | |||||
| => client.ChannelDestroyed += HandleChannelDestroyed; | |||||
| public Task HandleChannelDestroyed(SocketChannel channel) | |||||
| { | |||||
| if (channel is SocketGuildChannel guildChannel) | |||||
| Console.WriteLine( | |||||
| $"A new channel '{guildChannel.Name}'({guildChannel.Id}, {guildChannel.GetType()}) has been deleted."); | |||||
| return Task.CompletedTask; | |||||
| } | |||||
| #endregion | |||||
| #region ChannelUpdated | |||||
| public void HookChannelUpdated(BaseSocketClient client) | |||||
| => client.ChannelUpdated += HandleChannelRename; | |||||
| public Task HandleChannelRename(SocketChannel beforeChannel, SocketChannel afterChannel) | |||||
| { | |||||
| if (beforeChannel is SocketGuildChannel beforeGuildChannel && | |||||
| afterChannel is SocketGuildChannel afterGuildChannel) | |||||
| if (beforeGuildChannel.Name != afterGuildChannel.Name) | |||||
| Console.WriteLine( | |||||
| $"A channel ({beforeChannel.Id}) is renamed from {beforeGuildChannel.Name} to {afterGuildChannel.Name}."); | |||||
| return Task.CompletedTask; | |||||
| } | |||||
| #endregion | |||||
| #region MessageReceived | |||||
| private readonly ulong[] _targetUserIds = {168693960628371456, 53905483156684800}; | |||||
| public void HookMessageReceived(BaseSocketClient client) | |||||
| => client.MessageReceived += HandleMessageReceived; | |||||
| public Task HandleMessageReceived(SocketMessage message) | |||||
| { | |||||
| // check if the message is a user message as opposed to a system message (e.g. Clyde, pins, etc.) | |||||
| if (!(message is SocketUserMessage userMessage)) return Task.CompletedTask; | |||||
| // check if the message origin is a guild message channel | |||||
| if (!(userMessage.Channel is SocketTextChannel textChannel)) return Task.CompletedTask; | |||||
| // check if the target user was mentioned | |||||
| var targetUsers = userMessage.MentionedUsers.Where(x => _targetUserIds.Contains(x.Id)); | |||||
| foreach (var targetUser in targetUsers) | |||||
| Console.WriteLine( | |||||
| $"{targetUser} was mentioned in the message '{message.Content}' by {message.Author} in {textChannel.Name}."); | |||||
| return Task.CompletedTask; | |||||
| } | |||||
| #endregion | |||||
| #region MessageDeleted | |||||
| public void HookMessageDeleted(BaseSocketClient client) | |||||
| => client.MessageDeleted += HandleMessageDelete; | |||||
| public Task HandleMessageDelete(Cacheable<IMessage, ulong> cachedMessage, ISocketMessageChannel channel) | |||||
| { | |||||
| // check if the message exists in cache; if not, we cannot report what was removed | |||||
| if (!cachedMessage.HasValue) return Task.CompletedTask; | |||||
| var message = cachedMessage.Value; | |||||
| Console.WriteLine( | |||||
| $"A message ({message.Id}) from {message.Author} was removed from the channel {channel.Name} ({channel.Id}):" | |||||
| + Environment.NewLine | |||||
| + message.Content); | |||||
| return Task.CompletedTask; | |||||
| } | |||||
| #endregion | |||||
| } | |||||
| } | } | ||||
| #endregion | |||||
| @@ -405,7 +405,7 @@ namespace Discord.Rest | |||||
| /// </summary> | /// </summary> | ||||
| /// <example> | /// <example> | ||||
| /// The following example creates a new text channel under an existing category named <c>Wumpus</c> with a set topic. | /// The following example creates a new text channel under an existing category named <c>Wumpus</c> with a set topic. | ||||
| /// <code lang="cs"> | |||||
| /// <code language="cs"> | |||||
| /// var categories = await guild.GetCategoriesAsync(); | /// var categories = await guild.GetCategoriesAsync(); | ||||
| /// var targetCategory = categories.FirstOrDefault(x => x.Name == "wumpus"); | /// var targetCategory = categories.FirstOrDefault(x => x.Name == "wumpus"); | ||||
| /// if (targetCategory == null) return; | /// if (targetCategory == null) return; | ||||
| @@ -19,7 +19,8 @@ namespace Discord.WebSocket | |||||
| /// </para> | /// </para> | ||||
| /// </remarks> | /// </remarks> | ||||
| /// <example> | /// <example> | ||||
| /// <code source="..\Discord.Net.Examples\WebSocket\BaseSocketClient.Events.Examples.cs" region="ChannelCreated"></code> | |||||
| /// <code language="cs" region="ChannelCreated" | |||||
| /// source="..\Discord.Net.Examples\WebSocket\BaseSocketClient.Events.Examples.cs"/> | |||||
| /// </example> | /// </example> | ||||
| public event Func<SocketChannel, Task> ChannelCreated | public event Func<SocketChannel, Task> ChannelCreated | ||||
| { | { | ||||
| @@ -40,7 +41,8 @@ namespace Discord.WebSocket | |||||
| /// </para> | /// </para> | ||||
| /// </remarks> | /// </remarks> | ||||
| /// <example> | /// <example> | ||||
| /// <code source="..\Discord.Net.Examples\WebSocket\BaseSocketClient.Events.Examples.cs" region="ChannelDestroyed"></code> | |||||
| /// <code language="cs" region="ChannelDestroyed" | |||||
| /// source="..\Discord.Net.Examples\WebSocket\BaseSocketClient.Events.Examples.cs"/> | |||||
| /// </example> | /// </example> | ||||
| public event Func<SocketChannel, Task> ChannelDestroyed { | public event Func<SocketChannel, Task> ChannelDestroyed { | ||||
| add { _channelDestroyedEvent.Add(value); } | add { _channelDestroyedEvent.Add(value); } | ||||
| @@ -61,7 +63,8 @@ namespace Discord.WebSocket | |||||
| /// </para> | /// </para> | ||||
| /// </remarks> | /// </remarks> | ||||
| /// <example> | /// <example> | ||||
| /// <code source="..\Discord.Net.Examples\WebSocket\BaseSocketClient.Events.Examples.cs" region="ChannelUpdated"></code> | |||||
| /// <code language="cs" region="ChannelUpdated" | |||||
| /// source="..\Discord.Net.Examples\WebSocket\BaseSocketClient.Events.Examples.cs"/> | |||||
| /// </example> | /// </example> | ||||
| public event Func<SocketChannel, SocketChannel, Task> ChannelUpdated { | public event Func<SocketChannel, SocketChannel, Task> ChannelUpdated { | ||||
| add { _channelUpdatedEvent.Add(value); } | add { _channelUpdatedEvent.Add(value); } | ||||
| @@ -84,8 +87,9 @@ namespace Discord.WebSocket | |||||
| /// </para> | /// </para> | ||||
| /// </remarks> | /// </remarks> | ||||
| /// <example> | /// <example> | ||||
| /// The example below checks if the newly received message contains the target user. | |||||
| /// <code source="..\Discord.Net.Examples\WebSocket\BaseSocketClient.Events.Examples.cs" region="MessageReceived"></code> | |||||
| /// <para>The example below checks if the newly received message contains the target user.</para> | |||||
| /// <code language="cs" region="MessageReceived" | |||||
| /// source="..\Discord.Net.Examples\WebSocket\BaseSocketClient.Events.Examples.cs"/> | |||||
| /// </example> | /// </example> | ||||
| public event Func<SocketMessage, Task> MessageReceived { | public event Func<SocketMessage, Task> MessageReceived { | ||||
| add { _messageReceivedEvent.Add(value); } | add { _messageReceivedEvent.Add(value); } | ||||
| @@ -116,7 +120,8 @@ namespace Discord.WebSocket | |||||
| /// </para> | /// </para> | ||||
| /// </remarks> | /// </remarks> | ||||
| /// <example> | /// <example> | ||||
| /// <code source="..\Discord.Net.Examples\WebSocket\BaseSocketClient.Events.Examples.cs" region="MessageDeleted"></code> | |||||
| /// <code language="cs" region="MessageDeleted" | |||||
| /// source="..\Discord.Net.Examples\WebSocket\BaseSocketClient.Events.Examples.cs" /> | |||||
| /// </example> | /// </example> | ||||
| public event Func<Cacheable<IMessage, ulong>, ISocketMessageChannel, Task> MessageDeleted { | public event Func<Cacheable<IMessage, ulong>, ISocketMessageChannel, Task> MessageDeleted { | ||||
| add { _messageDeletedEvent.Add(value); } | add { _messageDeletedEvent.Add(value); } | ||||
| @@ -176,7 +181,8 @@ namespace Discord.WebSocket | |||||
| /// </note> | /// </note> | ||||
| /// </remarks> | /// </remarks> | ||||
| /// <example> | /// <example> | ||||
| /// <code source="..\Discord.Net.Examples\WebSocket\BaseSocketClient.Events.Examples.cs" region="ReactionAdded"></code> | |||||
| /// <code language="cs" region="ReactionAdded" | |||||
| /// source="..\Discord.Net.Examples\WebSocket\BaseSocketClient.Events.Examples.cs"/> | |||||
| /// </example> | /// </example> | ||||
| public event Func<Cacheable<IUserMessage, ulong>, ISocketMessageChannel, SocketReaction, Task> ReactionAdded { | public event Func<Cacheable<IUserMessage, ulong>, ISocketMessageChannel, SocketReaction, Task> ReactionAdded { | ||||
| add { _reactionAddedEvent.Add(value); } | add { _reactionAddedEvent.Add(value); } | ||||
| @@ -97,15 +97,15 @@ namespace Discord.WebSocket | |||||
| /// <remarks> | /// <remarks> | ||||
| /// This method gets the user present in the WebSocket cache with the given condition. | /// This method gets the user present in the WebSocket cache with the given condition. | ||||
| /// <note type="warning"> | /// <note type="warning"> | ||||
| /// Sometimes a user may return <c>null</c> due to Discord not sending offline users in large | |||||
| /// guilds (i.e. guild with 100+ members) actively. To download users on startup and to see | |||||
| /// more information about this subject, see <see cref="DiscordSocketConfig.AlwaysDownloadUsers"/>. | |||||
| /// Sometimes a user may return <c>null</c> due to Discord not sending offline users in large guilds | |||||
| /// (i.e. guild with 100+ members) actively. To download users on startup and to see more information | |||||
| /// about this subject, see <see cref="Discord.WebSocket.DiscordSocketConfig.AlwaysDownloadUsers" />. | |||||
| /// </note> | /// </note> | ||||
| /// <note> | /// <note> | ||||
| /// This method does not attempt to fetch users that the logged-in user does not have access to (i.e. | /// This method does not attempt to fetch users that the logged-in user does not have access to (i.e. | ||||
| /// users who don't share mutual guild(s) with the current user). If you wish to get a user that | |||||
| /// you do not have access to, consider using the REST implementation of | |||||
| /// <see cref="DiscordSocketRestClient.GetUserAsync"/>. | |||||
| /// users who don't share mutual guild(s) with the current user). If you wish to get a user that you do | |||||
| /// not have access to, consider using the REST implementation of | |||||
| /// <see cref="DiscordRestClient.GetUserAsync(System.UInt64,Discord.RequestOptions)" />. | |||||
| /// </note> | /// </note> | ||||
| /// </remarks> | /// </remarks> | ||||
| /// <returns> | /// <returns> | ||||
| @@ -116,22 +116,22 @@ namespace Discord.WebSocket | |||||
| /// <summary> | /// <summary> | ||||
| /// Gets a user. | /// Gets a user. | ||||
| /// </summary> | /// </summary> | ||||
| /// <param name="username">The name of the user.</param> | |||||
| /// <param name="discriminator">The discriminator value of the user.</param> | |||||
| /// <remarks> | /// <remarks> | ||||
| /// This method gets the user present in the WebSocket cache with the given condition. | /// This method gets the user present in the WebSocket cache with the given condition. | ||||
| /// <note type="warning"> | /// <note type="warning"> | ||||
| /// Sometimes a user may return <c>null</c> due to Discord not sending offline users in large | |||||
| /// guilds (i.e. guild with 100+ members) actively. To download users on startup and to see | |||||
| /// more information about this subject, see <see cref="DiscordSocketConfig.AlwaysDownloadUsers"/>. | |||||
| /// Sometimes a user may return <c>null</c> due to Discord not sending offline users in large guilds | |||||
| /// (i.e. guild with 100+ members) actively. To download users on startup and to see more information | |||||
| /// about this subject, see <see cref="Discord.WebSocket.DiscordSocketConfig.AlwaysDownloadUsers" />. | |||||
| /// </note> | /// </note> | ||||
| /// <note> | /// <note> | ||||
| /// This method does not attempt to fetch users that the logged-in user does not have access to (i.e. | /// This method does not attempt to fetch users that the logged-in user does not have access to (i.e. | ||||
| /// users who don't share mutual guild(s) with the current user). If you wish to get a user that | |||||
| /// you do not have access to, consider using the REST implementation of | |||||
| /// <see cref="DiscordSocketRestClient.GetUserAsync"/>. | |||||
| /// users who don't share mutual guild(s) with the current user). If you wish to get a user that you do | |||||
| /// not have access to, consider using the REST implementation of | |||||
| /// <see cref="DiscordRestClient.GetUserAsync(System.UInt64,Discord.RequestOptions)" />. | |||||
| /// </note> | /// </note> | ||||
| /// </remarks> | /// </remarks> | ||||
| /// <param name="username">The name of the user.</param> | |||||
| /// <param name="discriminator">The discriminator value of the user.</param> | |||||
| /// <returns> | /// <returns> | ||||
| /// A generic WebSocket-based user; <c>null</c> when the user cannot be found. | /// A generic WebSocket-based user; <c>null</c> when the user cannot be found. | ||||
| /// </returns> | /// </returns> | ||||
| @@ -94,8 +94,9 @@ namespace Discord.WebSocket | |||||
| /// Please note that it can be difficult to fill the cache completely on large guilds depending on the | /// Please note that it can be difficult to fill the cache completely on large guilds depending on the | ||||
| /// traffic. If you are using the command system, the default user TypeReader may fail to find the user | /// traffic. If you are using the command system, the default user TypeReader may fail to find the user | ||||
| /// due to this issue. This may be resolved at v3 of the library. Until then, you may want to consider | /// due to this issue. This may be resolved at v3 of the library. Until then, you may want to consider | ||||
| /// overriding the TypeReader and use <see cref="DiscordSocketRestClient.GetUserAsync"/> | |||||
| /// or <see cref="DiscordSocketRestClient.GetGuildUserAsync"/> as a backup. | |||||
| /// overriding the TypeReader and use | |||||
| /// <see cref="DiscordRestClient.GetUserAsync(System.UInt64,Discord.RequestOptions)"/> | |||||
| /// or <see cref="DiscordSocketRestClient.GetGuildUserAsync(ulong, ulong, RequestOptions)"/> as a backup. | |||||
| /// </note> | /// </note> | ||||
| /// </remarks> | /// </remarks> | ||||
| public bool AlwaysDownloadUsers { get; set; } = false; | public bool AlwaysDownloadUsers { get; set; } = false; | ||||
| @@ -535,7 +535,7 @@ namespace Discord.WebSocket | |||||
| /// </summary> | /// </summary> | ||||
| /// <example> | /// <example> | ||||
| /// The following example creates a new text channel under an existing category named <c>Wumpus</c> with a set topic. | /// The following example creates a new text channel under an existing category named <c>Wumpus</c> with a set topic. | ||||
| /// <code lang="cs"> | |||||
| /// <code language="cs"> | |||||
| /// var categories = await guild.GetCategoriesAsync(); | /// var categories = await guild.GetCategoriesAsync(); | ||||
| /// var targetCategory = categories.FirstOrDefault(x => x.Name == "wumpus"); | /// var targetCategory = categories.FirstOrDefault(x => x.Name == "wumpus"); | ||||
| /// if (targetCategory == null) return; | /// if (targetCategory == null) return; | ||||