| @@ -1987,6 +1987,11 @@ | |||||
| Represents a thread channel inside of a guild. | Represents a thread channel inside of a guild. | ||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="P:Discord.IThreadChannel.Joined"> | |||||
| <summary> | |||||
| <see langword="true"/> if the current user has joined this thread, otherwise <see langword="false"/>. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.IThreadChannel.Archived"> | <member name="P:Discord.IThreadChannel.Archived"> | ||||
| <summary> | <summary> | ||||
| <see langword="true"/> if the current thread is archived, otherwise <see langword="false"/>. | <see langword="true"/> if the current thread is archived, otherwise <see langword="false"/>. | ||||
| @@ -2017,6 +2022,18 @@ | |||||
| An approximate count of messages in a thread, stops counting at 50. | An approximate count of messages in a thread, stops counting at 50. | ||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="M:Discord.IThreadChannel.JoinAsync"> | |||||
| <summary> | |||||
| Joins the current thread. | |||||
| </summary> | |||||
| <returns></returns> | |||||
| </member> | |||||
| <member name="M:Discord.IThreadChannel.LeaveAsync"> | |||||
| <summary> | |||||
| Leaves the current thread. | |||||
| </summary> | |||||
| <returns></returns> | |||||
| </member> | |||||
| <member name="T:Discord.IVoiceChannel"> | <member name="T:Discord.IVoiceChannel"> | ||||
| <summary> | <summary> | ||||
| Represents a generic voice channel in a guild. | Represents a generic voice channel in a guild. | ||||
| @@ -4107,6 +4124,11 @@ | |||||
| A <see cref="T:Discord.IUser"/> or <see cref="T:Discord.IRole"/>. | A <see cref="T:Discord.IUser"/> or <see cref="T:Discord.IRole"/>. | ||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="F:Discord.ApplicationCommandOptionType.Number"> | |||||
| <summary> | |||||
| A <see cref="T:System.Double"/>. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="T:Discord.ApplicationCommandProperties"> | <member name="T:Discord.ApplicationCommandProperties"> | ||||
| <summary> | <summary> | ||||
| Provides properties that are used to modify a <see cref="T:Discord.IApplicationCommand" /> with the specified changes. | Provides properties that are used to modify a <see cref="T:Discord.IApplicationCommand" /> with the specified changes. | ||||
| @@ -4502,7 +4524,8 @@ | |||||
| </member> | </member> | ||||
| <member name="M:Discord.ComponentBuilder.WithButton(System.String,System.String,Discord.ButtonStyle,Discord.IEmote,System.String,System.Boolean,System.Int32)"> | <member name="M:Discord.ComponentBuilder.WithButton(System.String,System.String,Discord.ButtonStyle,Discord.IEmote,System.String,System.Boolean,System.Int32)"> | ||||
| <summary> | <summary> | ||||
| Adds a button to the specified row. | |||||
| Adds a <see cref="T:Discord.ButtonBuilder"/> with specified parameters to the <see cref="T:Discord.ComponentBuilder"/> at the specific row. | |||||
| If the row cannot accept the component then it will add it to a row that can. | |||||
| </summary> | </summary> | ||||
| <param name="label">The label text for the newly added button.</param> | <param name="label">The label text for the newly added button.</param> | ||||
| <param name="style">The style of this newly added button.</param> | <param name="style">The style of this newly added button.</param> | ||||
| @@ -4627,44 +4650,49 @@ | |||||
| Creates a new instance of a <see cref="T:Discord.ButtonBuilder"/> from instance of a <see cref="T:Discord.ButtonComponent"/>. | Creates a new instance of a <see cref="T:Discord.ButtonBuilder"/> from instance of a <see cref="T:Discord.ButtonComponent"/>. | ||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="M:Discord.ButtonBuilder.CreateLinkButton(System.String,System.String)"> | |||||
| <member name="M:Discord.ButtonBuilder.CreateLinkButton(System.String,System.String,Discord.IEmote)"> | |||||
| <summary> | <summary> | ||||
| Creates a button with the <see cref="F:Discord.ButtonStyle.Link"/> style. | Creates a button with the <see cref="F:Discord.ButtonStyle.Link"/> style. | ||||
| </summary> | </summary> | ||||
| <param name="label">The label to use on the newly created link button.</param> | |||||
| <param name="label">The label for this link button.</param> | |||||
| <param name="url">The url for this link button to go to.</param> | <param name="url">The url for this link button to go to.</param> | ||||
| <param name="emote">The emote for this link button</param> | |||||
| <returns>A builder with the newly created button.</returns> | <returns>A builder with the newly created button.</returns> | ||||
| </member> | </member> | ||||
| <member name="M:Discord.ButtonBuilder.CreateDangerButton(System.String,System.String)"> | |||||
| <member name="M:Discord.ButtonBuilder.CreateDangerButton(System.String,System.String,Discord.IEmote)"> | |||||
| <summary> | <summary> | ||||
| Creates a button with the <see cref="F:Discord.ButtonStyle.Danger"/> style. | Creates a button with the <see cref="F:Discord.ButtonStyle.Danger"/> style. | ||||
| </summary> | </summary> | ||||
| <param name="label">The label for this danger button.</param> | <param name="label">The label for this danger button.</param> | ||||
| <param name="customId">The custom id for this danger button.</param> | <param name="customId">The custom id for this danger button.</param> | ||||
| <param name="emote">The emote for this danger button</param> | |||||
| <returns>A builder with the newly created button.</returns> | <returns>A builder with the newly created button.</returns> | ||||
| </member> | </member> | ||||
| <member name="M:Discord.ButtonBuilder.CreatePrimaryButton(System.String,System.String)"> | |||||
| <member name="M:Discord.ButtonBuilder.CreatePrimaryButton(System.String,System.String,Discord.IEmote)"> | |||||
| <summary> | <summary> | ||||
| Creates a button with the <see cref="F:Discord.ButtonStyle.Primary"/> style. | Creates a button with the <see cref="F:Discord.ButtonStyle.Primary"/> style. | ||||
| </summary> | </summary> | ||||
| <param name="label">The label for this primary button.</param> | <param name="label">The label for this primary button.</param> | ||||
| <param name="customId">The custom id for this primary button.</param> | <param name="customId">The custom id for this primary button.</param> | ||||
| <param name="emote">The emote for this primary button</param> | |||||
| <returns>A builder with the newly created button.</returns> | <returns>A builder with the newly created button.</returns> | ||||
| </member> | </member> | ||||
| <member name="M:Discord.ButtonBuilder.CreateSecondaryButton(System.String,System.String)"> | |||||
| <member name="M:Discord.ButtonBuilder.CreateSecondaryButton(System.String,System.String,Discord.IEmote)"> | |||||
| <summary> | <summary> | ||||
| Creates a button with the <see cref="F:Discord.ButtonStyle.Secondary"/> style. | Creates a button with the <see cref="F:Discord.ButtonStyle.Secondary"/> style. | ||||
| </summary> | </summary> | ||||
| <param name="label">The label for this secondary button.</param> | <param name="label">The label for this secondary button.</param> | ||||
| <param name="customId">The custom id for this secondary button.</param> | <param name="customId">The custom id for this secondary button.</param> | ||||
| <param name="emote">The emote for this secondary button</param> | |||||
| <returns>A builder with the newly created button.</returns> | <returns>A builder with the newly created button.</returns> | ||||
| </member> | </member> | ||||
| <member name="M:Discord.ButtonBuilder.CreateSuccessButton(System.String,System.String)"> | |||||
| <member name="M:Discord.ButtonBuilder.CreateSuccessButton(System.String,System.String,Discord.IEmote)"> | |||||
| <summary> | <summary> | ||||
| Creates a button with the <see cref="F:Discord.ButtonStyle.Success"/> style. | Creates a button with the <see cref="F:Discord.ButtonStyle.Success"/> style. | ||||
| </summary> | </summary> | ||||
| <param name="label">The label for this success button.</param> | <param name="label">The label for this success button.</param> | ||||
| <param name="customId">The custom id for this success button.</param> | <param name="customId">The custom id for this success button.</param> | ||||
| <param name="emote">The emote for this success button</param> | |||||
| <returns>A builder with the newly created button.</returns> | <returns>A builder with the newly created button.</returns> | ||||
| </member> | </member> | ||||
| <member name="M:Discord.ButtonBuilder.WithLabel(System.String)"> | <member name="M:Discord.ButtonBuilder.WithLabel(System.String)"> | ||||
| @@ -11,6 +11,11 @@ namespace Discord | |||||
| /// </summary> | /// </summary> | ||||
| public interface IThreadChannel : ITextChannel, IGuildChannel | public interface IThreadChannel : ITextChannel, IGuildChannel | ||||
| { | { | ||||
| /// <summary> | |||||
| /// <see langword="true"/> if the current user has joined this thread, otherwise <see langword="false"/>. | |||||
| /// </summary> | |||||
| bool Joined { get; } | |||||
| /// <summary> | /// <summary> | ||||
| /// <see langword="true"/> if the current thread is archived, otherwise <see langword="false"/>. | /// <see langword="true"/> if the current thread is archived, otherwise <see langword="false"/>. | ||||
| /// </summary> | /// </summary> | ||||
| @@ -40,5 +45,17 @@ namespace Discord | |||||
| /// An approximate count of messages in a thread, stops counting at 50. | /// An approximate count of messages in a thread, stops counting at 50. | ||||
| /// </summary> | /// </summary> | ||||
| int MessageCount { get; } | int MessageCount { get; } | ||||
| /// <summary> | |||||
| /// Joins the current thread. | |||||
| /// </summary> | |||||
| /// <returns></returns> | |||||
| Task JoinAsync(); | |||||
| /// <summary> | |||||
| /// Leaves the current thread. | |||||
| /// </summary> | |||||
| /// <returns></returns> | |||||
| Task LeaveAsync(); | |||||
| } | } | ||||
| } | } | ||||
| @@ -0,0 +1,27 @@ | |||||
| using Newtonsoft.Json; | |||||
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.Linq; | |||||
| using System.Text; | |||||
| using System.Threading.Tasks; | |||||
| namespace Discord.API.Gateway | |||||
| { | |||||
| internal class ThreadMembersUpdated | |||||
| { | |||||
| [JsonProperty("id")] | |||||
| public ulong Id { get; set; } | |||||
| [JsonProperty("guild_id")] | |||||
| public ulong GuildId { get; set; } | |||||
| [JsonProperty("member_count")] | |||||
| public int MemberCount { get; set; } | |||||
| [JsonProperty("added_members")] | |||||
| public Optional<ThreadMember[]> AddedMembers { get; set; } | |||||
| [JsonProperty("removed_member_ids")] | |||||
| public Optional<ulong[]> RemovedMemberIds { get; set; } | |||||
| } | |||||
| } | |||||
| @@ -756,6 +756,21 @@ | |||||
| </note> | </note> | ||||
| </remarks> | </remarks> | ||||
| </member> | </member> | ||||
| <member name="E:Discord.WebSocket.BaseSocketClient.ThreadCreated"> | |||||
| <summary> | |||||
| Fired when a thread is created within a guild. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="E:Discord.WebSocket.BaseSocketClient.ThreadUpdated"> | |||||
| <summary> | |||||
| Fired when a thread is updated within a guild. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="E:Discord.WebSocket.BaseSocketClient.ThreadDeleted"> | |||||
| <summary> | |||||
| Fired when a thread is deleted. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.DiscordShardedClient.Latency"> | <member name="P:Discord.WebSocket.DiscordShardedClient.Latency"> | ||||
| <inheritdoc /> | <inheritdoc /> | ||||
| </member> | </member> | ||||
| @@ -2154,6 +2169,11 @@ | |||||
| <member name="P:Discord.WebSocket.SocketTextChannel.Users"> | <member name="P:Discord.WebSocket.SocketTextChannel.Users"> | ||||
| <inheritdoc /> | <inheritdoc /> | ||||
| </member> | </member> | ||||
| <member name="P:Discord.WebSocket.SocketTextChannel.Threads"> | |||||
| <summary> | |||||
| Gets a collection of threads within this text channel. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="M:Discord.WebSocket.SocketTextChannel.ModifyAsync(System.Action{Discord.TextChannelProperties},Discord.RequestOptions)"> | <member name="M:Discord.WebSocket.SocketTextChannel.ModifyAsync(System.Action{Discord.TextChannelProperties},Discord.RequestOptions)"> | ||||
| <inheritdoc /> | <inheritdoc /> | ||||
| </member> | </member> | ||||
| @@ -2360,9 +2380,19 @@ | |||||
| Represents a thread channel inside of a guild. | Represents a thread channel inside of a guild. | ||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="P:Discord.WebSocket.SocketThreadChannel.ParentChannel"> | |||||
| <member name="P:Discord.WebSocket.SocketThreadChannel.Joined"> | |||||
| <inheritdoc/> | <inheritdoc/> | ||||
| </member> | </member> | ||||
| <member name="P:Discord.WebSocket.SocketThreadChannel.IsPrivateThread"> | |||||
| <summary> | |||||
| <see langword="true"/> if this thread is private, otherwise <see langword="false"/> | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadChannel.ParentChannel"> | |||||
| <summary> | |||||
| Gets the parent channel this thread resides in. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadChannel.MessageCount"> | <member name="P:Discord.WebSocket.SocketThreadChannel.MessageCount"> | ||||
| <inheritdoc/> | <inheritdoc/> | ||||
| </member> | </member> | ||||
| @@ -2848,6 +2878,14 @@ | |||||
| A read-only collection of category channels found within this guild. | A read-only collection of category channels found within this guild. | ||||
| </returns> | </returns> | ||||
| </member> | </member> | ||||
| <member name="P:Discord.WebSocket.SocketGuild.ThreadChannels"> | |||||
| <summary> | |||||
| Gets a collection of all thread channels in this guild. | |||||
| </summary> | |||||
| <returns> | |||||
| A read-only collection of thread channels found within this guild. | |||||
| </returns> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketGuild.CurrentUser"> | <member name="P:Discord.WebSocket.SocketGuild.CurrentUser"> | ||||
| <summary> | <summary> | ||||
| Gets the current logged-in user. | Gets the current logged-in user. | ||||
| @@ -3431,10 +3469,11 @@ | |||||
| </member> | </member> | ||||
| <member name="M:Discord.WebSocket.SocketMessageComponent.UpdateAsync(System.Action{Discord.MessageProperties},Discord.RequestOptions)"> | <member name="M:Discord.WebSocket.SocketMessageComponent.UpdateAsync(System.Action{Discord.MessageProperties},Discord.RequestOptions)"> | ||||
| <summary> | <summary> | ||||
| Updates the original message of the component on which the interaction was received on. | |||||
| Updates the message which this component resides in with the type <see cref="F:Discord.InteractionResponseType.UpdateMessage"/> | |||||
| </summary> | </summary> | ||||
| <param name="func">A delegate containing the properties to modify the message with.</param> | <param name="func">A delegate containing the properties to modify the message with.</param> | ||||
| <param name="options">The request options for this async request.</param> | <param name="options">The request options for this async request.</param> | ||||
| <returns>A task that represents the asynchronous operation of updating the message.</returns> | |||||
| </member> | </member> | ||||
| <member name="M:Discord.WebSocket.SocketMessageComponent.FollowupAsync(System.String,Discord.Embed[],System.Boolean,System.Boolean,Discord.AllowedMentions,Discord.RequestOptions,Discord.MessageComponent)"> | <member name="M:Discord.WebSocket.SocketMessageComponent.FollowupAsync(System.String,Discord.Embed[],System.Boolean,System.Boolean,Discord.AllowedMentions,Discord.RequestOptions,Discord.MessageComponent)"> | ||||
| <inheritdoc/> | <inheritdoc/> | ||||
| @@ -3689,6 +3728,14 @@ | |||||
| <param name="options">The request options for this async request.</param> | <param name="options">The request options for this async request.</param> | ||||
| <returns>A <see cref="T:Discord.Rest.RestInteractionMessage"/> that represents the initial response.</returns> | <returns>A <see cref="T:Discord.Rest.RestInteractionMessage"/> that represents the initial response.</returns> | ||||
| </member> | </member> | ||||
| <member name="M:Discord.WebSocket.SocketInteraction.AcknowledgeAsync(Discord.RequestOptions)"> | |||||
| <summary> | |||||
| Acknowledges this interaction. | |||||
| </summary> | |||||
| <returns> | |||||
| A task that represents the asynchronous operation of acknowledging the interaction. | |||||
| </returns> | |||||
| </member> | |||||
| <member name="M:Discord.WebSocket.SocketInteraction.DeferAsync(Discord.RequestOptions)"> | <member name="M:Discord.WebSocket.SocketInteraction.DeferAsync(Discord.RequestOptions)"> | ||||
| <summary> | <summary> | ||||
| Acknowledges this interaction. | Acknowledges this interaction. | ||||
| @@ -4488,6 +4535,156 @@ | |||||
| <member name="M:Discord.WebSocket.SocketSelfUser.ModifyAsync(System.Action{Discord.SelfUserProperties},Discord.RequestOptions)"> | <member name="M:Discord.WebSocket.SocketSelfUser.ModifyAsync(System.Action{Discord.SelfUserProperties},Discord.RequestOptions)"> | ||||
| <inheritdoc /> | <inheritdoc /> | ||||
| </member> | </member> | ||||
| <member name="P:Discord.WebSocket.SocketThreadUser.Thread"> | |||||
| <summary> | |||||
| Gets the <see cref="T:Discord.WebSocket.SocketThreadChannel"/> this user is in. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.ThreadJoinedAt"> | |||||
| <summary> | |||||
| Gets the timestamp for when this user joined this thread. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.Guild"> | |||||
| <summary> | |||||
| Gets the guild this user is in. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.JoinedAt"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.Nickname"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.PremiumSince"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.IsPending"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.AvatarId"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.Discriminator"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.DiscriminatorValue"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.IsBot"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.IsWebhook"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.Username"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.PublicFlags"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.CreatedAt"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.Id"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.Mention"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.Status"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.ActiveClients"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.Activities"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.IsDeafened"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.IsMuted"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.IsSelfDeafened"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.IsSelfMuted"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.IsSuppressed"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.VoiceChannel"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.VoiceSessionId"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.IsStreaming"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="M:Discord.WebSocket.SocketThreadUser.GetPermissions(Discord.IGuildChannel)"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="M:Discord.WebSocket.SocketThreadUser.KickAsync(System.String,Discord.RequestOptions)"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="M:Discord.WebSocket.SocketThreadUser.ModifyAsync(System.Action{Discord.GuildUserProperties},Discord.RequestOptions)"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="M:Discord.WebSocket.SocketThreadUser.AddRoleAsync(System.UInt64,Discord.RequestOptions)"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="M:Discord.WebSocket.SocketThreadUser.AddRoleAsync(Discord.IRole,Discord.RequestOptions)"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="M:Discord.WebSocket.SocketThreadUser.AddRolesAsync(System.Collections.Generic.IEnumerable{System.UInt64},Discord.RequestOptions)"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="M:Discord.WebSocket.SocketThreadUser.AddRolesAsync(System.Collections.Generic.IEnumerable{Discord.IRole},Discord.RequestOptions)"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="M:Discord.WebSocket.SocketThreadUser.RemoveRoleAsync(System.UInt64,Discord.RequestOptions)"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="M:Discord.WebSocket.SocketThreadUser.RemoveRoleAsync(Discord.IRole,Discord.RequestOptions)"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="M:Discord.WebSocket.SocketThreadUser.RemoveRolesAsync(System.Collections.Generic.IEnumerable{System.UInt64},Discord.RequestOptions)"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="M:Discord.WebSocket.SocketThreadUser.RemoveRolesAsync(System.Collections.Generic.IEnumerable{Discord.IRole},Discord.RequestOptions)"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="M:Discord.WebSocket.SocketThreadUser.GetAvatarUrl(Discord.ImageFormat,System.UInt16)"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="M:Discord.WebSocket.SocketThreadUser.GetDefaultAvatarUrl"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="M:Discord.WebSocket.SocketThreadUser.CreateDMChannelAsync(Discord.RequestOptions)"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.Discord#IGuildUser#GuildPermissions"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.Discord#IGuildUser#Guild"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.Discord#IGuildUser#GuildId"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketThreadUser.Discord#IGuildUser#RoleIds"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="M:Discord.WebSocket.SocketThreadUser.op_Explicit(Discord.WebSocket.SocketThreadUser)~Discord.WebSocket.SocketGuildUser"> | |||||
| <summary> | |||||
| Gets the guild user of this thread user. | |||||
| </summary> | |||||
| <param name="user"></param> | |||||
| </member> | |||||
| <member name="T:Discord.WebSocket.SocketUnknownUser"> | <member name="T:Discord.WebSocket.SocketUnknownUser"> | ||||
| <summary> | <summary> | ||||
| Represents a WebSocket-based user that is yet to be recognized by the client. | Represents a WebSocket-based user that is yet to be recognized by the client. | ||||
| @@ -1975,48 +1975,62 @@ namespace Discord.WebSocket | |||||
| // Threads | // Threads | ||||
| case "THREAD_CREATE": | case "THREAD_CREATE": | ||||
| { | { | ||||
| await _gatewayLogger.DebugAsync("Received Dispatch (THREAD_CREATE)").ConfigureAwait(false); | |||||
| try | |||||
| { | |||||
| await _gatewayLogger.DebugAsync("Received Dispatch (THREAD_CREATE)").ConfigureAwait(false); | |||||
| var data = (payload as JToken).ToObject<Channel>(_serializer); | |||||
| var data = (payload as JToken).ToObject<Channel>(_serializer); | |||||
| var guild = State.GetGuild(data.GuildId.Value); | |||||
| var guild = State.GetGuild(data.GuildId.Value); | |||||
| if(guild == null) | |||||
| { | |||||
| await UnknownGuildAsync(type, data.GuildId.Value); | |||||
| return; | |||||
| } | |||||
| if (guild == null) | |||||
| { | |||||
| await UnknownGuildAsync(type, data.GuildId.Value); | |||||
| return; | |||||
| } | |||||
| var threadChannel = (SocketThreadChannel)guild.AddChannel(this.State, data); | |||||
| var threadChannel = (SocketThreadChannel)guild.AddChannel(this.State, data); | |||||
| await TimedInvokeAsync(_threadCreated, nameof(ThreadCreated), threadChannel).ConfigureAwait(false); | |||||
| } | |||||
| catch(Exception x) | |||||
| { | |||||
| await TimedInvokeAsync(_threadCreated, nameof(ThreadCreated), threadChannel).ConfigureAwait(false); | |||||
| } | |||||
| } | } | ||||
| break; | break; | ||||
| case "THREAD_UPDATE": | case "THREAD_UPDATE": | ||||
| { | { | ||||
| await _gatewayLogger.DebugAsync("Received Dispatch (THREAD_UPDATE)").ConfigureAwait(false); | |||||
| var data = (payload as JToken).ToObject<API.Channel>(_serializer); | |||||
| var guild = State.GetGuild(data.GuildId.Value); | |||||
| if (guild == null) | |||||
| try | |||||
| { | { | ||||
| await UnknownGuildAsync(type, data.GuildId.Value); | |||||
| return; | |||||
| } | |||||
| await _gatewayLogger.DebugAsync("Received Dispatch (THREAD_UPDATE)").ConfigureAwait(false); | |||||
| var channel = (SocketThreadChannel)guild.GetChannel(data.Id); | |||||
| var data = (payload as JToken).ToObject<API.Channel>(_serializer); | |||||
| var guild = State.GetGuild(data.GuildId.Value); | |||||
| if (guild == null) | |||||
| { | |||||
| await UnknownGuildAsync(type, data.GuildId.Value); | |||||
| return; | |||||
| } | |||||
| var before = channel.Clone(); | |||||
| channel.Update(State, data); | |||||
| var channel = (SocketThreadChannel)guild.GetChannel(data.Id); | |||||
| if (!(guild?.IsSynced ?? true)) | |||||
| { | |||||
| await UnsyncedGuildAsync(type, guild.Id).ConfigureAwait(false); | |||||
| return; | |||||
| var before = channel.Clone(); | |||||
| channel.Update(State, data); | |||||
| if (!(guild?.IsSynced ?? true)) | |||||
| { | |||||
| await UnsyncedGuildAsync(type, guild.Id).ConfigureAwait(false); | |||||
| return; | |||||
| } | |||||
| await TimedInvokeAsync(_threadUpdated, nameof(ThreadUpdated), before, channel).ConfigureAwait(false); | |||||
| } | } | ||||
| catch(Exception x) | |||||
| { | |||||
| await TimedInvokeAsync(_threadUpdated, nameof(ThreadUpdated), before, channel).ConfigureAwait(false); | |||||
| } | |||||
| } | } | ||||
| break; | break; | ||||
| @@ -2071,8 +2085,20 @@ namespace Discord.WebSocket | |||||
| } | } | ||||
| break; | break; | ||||
| case "THREAD_MEMBER_UPDATE": | case "THREAD_MEMBER_UPDATE": | ||||
| { | |||||
| await _gatewayLogger.DebugAsync("Received Dispatch (THREAD_MEMBER_UPDATE)").ConfigureAwait(false); | |||||
| var p = payload; | |||||
| } | |||||
| break; | break; | ||||
| case "THREAD_MEMBERS_UPDATE": // based on intents | case "THREAD_MEMBERS_UPDATE": // based on intents | ||||
| { | |||||
| await _gatewayLogger.DebugAsync("Received Dispatch (THREAD_MEMBERS_UPDATE)").ConfigureAwait(false); | |||||
| var data = (payload as JToken).ToObject<ThreadMembersUpdated>(_serializer); | |||||
| } | |||||
| break; | break; | ||||
| //Ignored (User only) | //Ignored (User only) | ||||
| @@ -66,9 +66,9 @@ namespace Discord.WebSocket | |||||
| internal override void Update(ClientState state, Model model) | internal override void Update(ClientState state, Model model) | ||||
| { | { | ||||
| Name = model.Name.Value; | Name = model.Name.Value; | ||||
| Position = model.Position.Value; | |||||
| Position = model.Position.GetValueOrDefault(0); | |||||
| var overwrites = model.PermissionOverwrites.Value; | |||||
| var overwrites = model.PermissionOverwrites.GetValueOrDefault(new API.Overwrite[0]); | |||||
| var newOverwrites = ImmutableArray.CreateBuilder<Overwrite>(overwrites.Length); | var newOverwrites = ImmutableArray.CreateBuilder<Overwrite>(overwrites.Length); | ||||
| for (int i = 0; i < overwrites.Length; i++) | for (int i = 0; i < overwrites.Length; i++) | ||||
| newOverwrites.Add(overwrites[i].ToEntity()); | newOverwrites.Add(overwrites[i].ToEntity()); | ||||
| @@ -2,19 +2,26 @@ using Discord.Rest; | |||||
| using System; | using System; | ||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||
| using System.Collections.Immutable; | using System.Collections.Immutable; | ||||
| using System.Diagnostics; | |||||
| using System.IO; | using System.IO; | ||||
| using System.Linq; | using System.Linq; | ||||
| using System.Text; | using System.Text; | ||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
| using Model = Discord.API.Channel; | using Model = Discord.API.Channel; | ||||
| using ThreadMember = Discord.API.ThreadMember; | |||||
| namespace Discord.WebSocket | namespace Discord.WebSocket | ||||
| { | { | ||||
| /// <summary> | /// <summary> | ||||
| /// Represents a thread channel inside of a guild. | /// Represents a thread channel inside of a guild. | ||||
| /// </summary> | /// </summary> | ||||
| [DebuggerDisplay(@"{DebuggerDisplay,nq}")] | |||||
| public class SocketThreadChannel : SocketGuildChannel, IThreadChannel, ISocketMessageChannel | public class SocketThreadChannel : SocketGuildChannel, IThreadChannel, ISocketMessageChannel | ||||
| { | { | ||||
| /// <inheritdoc/> | |||||
| public bool Joined { get; private set; } | |||||
| /// <summary> | /// <summary> | ||||
| /// <see langword="true"/> if this thread is private, otherwise <see langword="false"/> | /// <see langword="true"/> if this thread is private, otherwise <see langword="false"/> | ||||
| /// </summary> | /// </summary> | ||||
| @@ -65,6 +72,8 @@ namespace Discord.WebSocket | |||||
| private readonly MessageCache _messages; | private readonly MessageCache _messages; | ||||
| private string DebuggerDisplay => $"{Name} ({Id}, Thread)"; | |||||
| internal SocketThreadChannel(DiscordSocketClient discord, SocketGuild guild, ulong id, SocketTextChannel parent) | internal SocketThreadChannel(DiscordSocketClient discord, SocketGuild guild, ulong id, SocketTextChannel parent) | ||||
| : base(discord, id, guild) | : base(discord, id, guild) | ||||
| { | { | ||||
| @@ -97,6 +106,11 @@ namespace Discord.WebSocket | |||||
| } | } | ||||
| } | } | ||||
| internal void Update(ClientState state, ThreadMember self) | |||||
| { | |||||
| } | |||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public virtual Task SyncPermissionsAsync(RequestOptions options = null) | public virtual Task SyncPermissionsAsync(RequestOptions options = null) | ||||
| => ChannelHelper.SyncPermissionsAsync(this, Discord, options); | => ChannelHelper.SyncPermissionsAsync(this, Discord, options); | ||||
| @@ -253,10 +267,10 @@ namespace Discord.WebSocket | |||||
| public Task GetUsersAsync() | public Task GetUsersAsync() | ||||
| { | { | ||||
| return Task.CompletedTask; | |||||
| } | } | ||||
| private string DebuggerDisplay => $"{Name} ({Id}, Thread)"; | |||||
| internal new SocketThreadChannel Clone() => MemberwiseClone() as SocketThreadChannel; | internal new SocketThreadChannel Clone() => MemberwiseClone() as SocketThreadChannel; | ||||
| //ITextChannel | //ITextChannel | ||||
| @@ -325,22 +339,22 @@ namespace Discord.WebSocket | |||||
| public Task JoinAsync() | public Task JoinAsync() | ||||
| { | { | ||||
| return Task.CompletedTask; | |||||
| } | } | ||||
| public Task LeaveAsync() | public Task LeaveAsync() | ||||
| { | { | ||||
| return Task.CompletedTask; | |||||
| } | } | ||||
| public Task AddThreadMember(IGuildUser user) | public Task AddThreadMember(IGuildUser user) | ||||
| { | { | ||||
| return Task.CompletedTask; | |||||
| } | } | ||||
| public Task RemoveThreadMember(IGuildUser user) | public Task RemoveThreadMember(IGuildUser user) | ||||
| { | { | ||||
| return Task.CompletedTask; | |||||
| } | } | ||||